swift - 如何从 alamofire 请求反序列化集合

标签 swift alamofire

这是一个非常基本的关于在 alamofire 和 swift 中反序列化 responsejson 集合的语法问题

我有一个 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] 结果,我应该映射它吗?

如果我使用下面的 map 语法,我有几个问题

let friends = result?.map {
                    return $0["uname"] as String?
                } 

使用可选的返回值,我可以让它以一种优雅的方式返回 [String] 而不是 [String?] - 有没有办法让 map 以简洁的语法仅返回非空值?

还有更好的映射语法可以让我命名参数而不是使用 $0 吗?

最佳答案

我使用 Alamofire 和 SwiftyJSON 来完成这项工作,并将 JSON 对象数组反序列化为 native 对象。以下是我如何做到这一点的示例:

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 对象的属性。

关于swift - 如何从 alamofire 请求反序列化集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31135534/

相关文章:

ios - iOS Swift 格式正确的 ."UserInfo={NSDebugDescription=Garbage at end ---> Data cannot be read because it isn' t 末尾的垃圾

swift - Alamofire 忽略 timeoutIntervalForRequest 和 timeoutIntervalForResource 参数

swift - 如何通过拖动重新排列 SwiftUI ZStack 中的 View

json - 从 Swift 中的 API 响应中提取可用数据

iOS 12 UIContextualAction 图像无法推断图像颜色

swift - Alamofire:使用字典数组发送 JSON

swift - Alamofire for 循环在 Playgrounds 中返回空数组

ios - 多参数字典(集合列表)如: [[String: Any]] to Alamofire Parameters

ios - 从初始化器返回而不初始化所有存储的属性 - SwiftUI 绑定(bind)错误

ios - 如何重新定位 UIRefreshControl