/ /アラモファイア要求からコレクションをデシリアライズする方法 - 迅速なアラモファイア

アラモファイヤーリクエストからコレクションをデシリアライズする方法 - 迅速なアラモファイア

これは、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?]を返すようにすることができます。つまり、マップにnull以外の値のみを簡潔な構文で返す方法はありませんか?

また、$ 0を使用する代わりに、パラメータに名前を付けるためのマップの構文が改善されていますか?

回答:

回答№1の場合は3

私は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 initialiserは、NSDictionaryの値をConcertModelオブジェクトのプロパティにマップするだけです。


回答№2の場合は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" }
]
}