如何反序列化来自 alamofire 请求的集合
how to deserialize a collection from an alamofire request
这是一个非常基本的语法问题,用于反序列化 alamofire 和 swift
中的响应json 集合
我有一个 return 用户对象数组的 GET 服务,例如
[
{"uname": "bob"},
{"uname": "jane"}
]
这是我的请求
Alamofire.request(.GET, url , encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
let result = JSON as? [Dictionary<String,String>]
if (response!.statusCode == 200 && error == nil){
//how should I deserialize the result here to return [String]
callback(success: true, errorMsg: nil, friends:friends)
}
else{
callback(success: false,errorMsg:error?.localizedDescription,friends:nil)
}
})
我的问题是如何反序列化结果,我假设 json 结果是 [Dictionary] 并且为了让我将其更改为 [String] 结果是否正确?贴图吗?
如果我使用下面的地图语法,我有几个问题
let friends = result?.map {
return [=12=]["uname"] as String?
}
使用可选的 return 值,我可以以一种优雅的方式将它变成 return 一个 [String] 而不是 [String?] - 没有办法让 map return 以某种简洁的语法仅包含非空值?
还有更好的 map 语法可以让我命名参数而不是使用 $0 吗?
我将 Alamofire 与 SwiftyJSON 结合使用来完成这项工作,并将 JSON 对象数组反序列化为本机对象。这是我如何操作的示例:
Alamofire.request(request)
.responseJSON(options: nil) { (request, response, json, error) -> Void in
if let requestError = error as NSError?{
callback!(nil, nil, requestError)
}
if let httpResponse = response as NSHTTPURLResponse?{
if(httpResponse.statusCode != 200){
callback!(nil, httpResponse, nil)
} else{
let jsonResult = JSON(json!) as JSON
var concerts = self.deserializeConcerts(jsonResult)
callback!(concerts, nil, nil)
}
}
}
反序列化音乐会如下所示:
class private func deserializeConcerts(concerts: SwiftyJSON.JSON) -> [ConcertModel]{
let concertsArray = concerts.object as! NSMutableArray
var concertObjs = [ConcertModel]()
for concert in concertsArray{
let concertObj = ConcertModel(concert: concert as! NSDictionary)
concertObjs.append(concertObj)
}
return concertObjs
}
最后,ConcertModel
初始化程序只是将 NSDictionary 的值映射到 ConcertModel 对象的属性。
Alamofire 4.3 的更新实施
Alamofire.request(url, method: .get)
.responseJSON { response in
if response.data != nil {
let json = JSON(data: response.data!)
let name = json["data"][0]["name"].string
if name != nil {
print(name!)
}
}
}
这将解析此 JSON 输入:
{
data: [
{ name: 'John' },
{ name: 'Dave' }
]
}
这是一个非常基本的语法问题,用于反序列化 alamofire 和 swift
中的响应json 集合我有一个 return 用户对象数组的 GET 服务,例如
[
{"uname": "bob"},
{"uname": "jane"}
]
这是我的请求
Alamofire.request(.GET, url , encoding:.JSON)
.responseJSON(options: .MutableContainers, completionHandler:{ (request, response, JSON, error) -> Void in
let result = JSON as? [Dictionary<String,String>]
if (response!.statusCode == 200 && error == nil){
//how should I deserialize the result here to return [String]
callback(success: true, errorMsg: nil, friends:friends)
}
else{
callback(success: false,errorMsg:error?.localizedDescription,friends:nil)
}
})
我的问题是如何反序列化结果,我假设 json 结果是 [Dictionary] 并且为了让我将其更改为 [String] 结果是否正确?贴图吗?
如果我使用下面的地图语法,我有几个问题
let friends = result?.map {
return [=12=]["uname"] as String?
}
使用可选的 return 值,我可以以一种优雅的方式将它变成 return 一个 [String] 而不是 [String?] - 没有办法让 map return 以某种简洁的语法仅包含非空值?
还有更好的 map 语法可以让我命名参数而不是使用 $0 吗?
我将 Alamofire 与 SwiftyJSON 结合使用来完成这项工作,并将 JSON 对象数组反序列化为本机对象。这是我如何操作的示例:
Alamofire.request(request)
.responseJSON(options: nil) { (request, response, json, error) -> Void in
if let requestError = error as NSError?{
callback!(nil, nil, requestError)
}
if let httpResponse = response as NSHTTPURLResponse?{
if(httpResponse.statusCode != 200){
callback!(nil, httpResponse, nil)
} else{
let jsonResult = JSON(json!) as JSON
var concerts = self.deserializeConcerts(jsonResult)
callback!(concerts, nil, nil)
}
}
}
反序列化音乐会如下所示:
class private func deserializeConcerts(concerts: SwiftyJSON.JSON) -> [ConcertModel]{
let concertsArray = concerts.object as! NSMutableArray
var concertObjs = [ConcertModel]()
for concert in concertsArray{
let concertObj = ConcertModel(concert: concert as! NSDictionary)
concertObjs.append(concertObj)
}
return concertObjs
}
最后,ConcertModel
初始化程序只是将 NSDictionary 的值映射到 ConcertModel 对象的属性。
Alamofire 4.3 的更新实施
Alamofire.request(url, method: .get)
.responseJSON { response in
if response.data != nil {
let json = JSON(data: response.data!)
let name = json["data"][0]["name"].string
if name != nil {
print(name!)
}
}
}
这将解析此 JSON 输入:
{
data: [
{ name: 'John' },
{ name: 'Dave' }
]
}