2015-06-30 135 views
2

这是用于在反序列化alamofire responsejson收集和语法的一个非常基本的问题迅速如何从alamofire请求

我有一个返回的用户的阵列例如对象一个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结果是[解释],为了为我改变它到[字符串]的结果,我应该映射它?

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

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

使用可选的返回值,我可以得到它的返回,而不是一个[字符串]在一个优雅的方式[字符串?] - 没有办法让map以某种简洁的语法以某种方式返回非null值?

也有更好的地图语法,让我命名参数,而不是使用$ 0?

回答

3

我使用带有SwiftyJSON的Alamofire来完成这个工作并将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

为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' } 
    ] 
}