2017-03-01 42 views
0

我該如何使用URLSession獲取JSON對象,以便我能夠將它從ObjectMapper轉換爲Map對象?這是我從API服務器獲取數據代碼:Swift 3 ObjectMapper - 將URLSession結果轉換爲Map對象失敗

func makeGetRequest(completionHandler: @escaping ((AnyObject?) -> Void)) { 
    let session = URLSession(configuration: .default) 
    guard let requestUrl = URL(string:buildUrl()) else { return } 
    var request = URLRequest(url:requestUrl) 

    //HEADERS 
    request.addValue("multipart/form-data; charset=utf-8", forHTTPHeaderField: "Content-Type"); 

    let token = CredentialsManager.sharedInstance().token; 
    if (!(token?.isEmpty)!) { 
     request.addValue(token!, forHTTPHeaderField: "X-Auth-Token"); 
    }; 

    let task : URLSessionDataTask = session.dataTask(with: request, completionHandler: {(data, response, error) in 
     guard let data = data, error == nil else { return } 
     do { 
      let resultJSON = try JSONSerialization.jsonObject(with: data) as! [[String:AnyObject]] 
      completionHandler(resultJSON as AnyObject?) 
     } catch let error as NSError { 
      // Handle error 
     } 
    }); 

    task.resume() 
} 

這是函數,我呼籲數據是牽強:

public func getUser() { 
    makeGetRequest() { (result) -> Void in 
     let resultModel = UserModel(map: result as! Map) 
     self.resultDelegate.onUserRequestSuccess(model: resultModel!) 
    } 
} 

,這裏是我的usermodel實現可映射協議:

class UserModel : Mappable { 

var id: Int? 
var username: String? 

required init?(map: Map) { 

} 

// Mappable 
func mapping(map: Map) { 
    id <- map["id"] 
    username <- map["username"] 
} 

}

而且同時呼籲

UserModel(map: result as! Map)

我得到的錯誤:

Could not cast value of type '__NSDictionaryI' to 'NSArray'

回答

0

Get response in using JSONSerialization below is code for ObjectMapper:

let headers: HTTPHeaders = ["Accept": "application/json", "Authorization": authBearer] 

Alamofire.request(url, method: .get, parameters: nil, headers: headers).responseJSON { response in 
      print(response.result.value ?? "") 
      let json = try! JSONSerialization.jsonObject(with: response.data!, options: []) 
      let report = Mapper<Department>().map(JSON: json as! [String : Any]) 
      print(report?.department[0].employee[0].first_name ?? "") 
} 

class Department: Mappable { 
    var department = [Directory]() 

    required convenience init?(map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
    department <- map["department"] 
    } 

} 

class Directory:Mappable { 
    var id = 0 
    var name = "" 
    var employee = [Employee]() 
    var genre = "" 

    //Impl. of Mappable protocol 
    required convenience init?(map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     id <- map["id"] 
     name <- map["name"] 
     employee <- map["employee"] 
     genre <- map["genre"] 
    } 
} 

class Employee: Mappable { 
    var address = "" 
    var dob = "" 
    var email = "" 
    var first_name = "" 
    var last_name = "" 
    var phone_number = "" 

    required convenience init?(map: Map) { 
     self.init() 
    } 

    func mapping(map: Map) { 
     address <- map["address"] 
     dob <- map["dob"] 
     email <- map["email"] 
     first_name <- map["first_name"] 
     last_name <- map["last_name"] 
     phone_number <- map["phone_number"] 

    } 
}