2015-06-30 198 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' } 
    ] 
}