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

时间:2015-06-30 10:14:18

标签: 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]结果,我应该映射吗?

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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

更新了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' }
  ]
}