/ / comment désérialiser une collection d'une demande alamofire - swift, alamofire

comment désérialiser une collection d'une demande alamofire - swift, alamofire

c’est une question assez fondamentale de la syntaxe pour désérialiser la collection responsejson dans alamofire et swift

J'ai un service GET qui renvoie un tableau d'objets utilisateur, par exemple.

[
{"uname": "bob"},
{"uname": "jane"}
]

et voici ma demande

   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)
}
})

Ma question est de savoir comment désérialiser le résultat, et ai-je raison de supposer que le résultat JSON est un [Dictionnaire] et pour que je puisse le changer en résultat [String], dois-je le mapper?

Si j'utilise la syntaxe de la carte ci-dessous, j'ai quelques questions.

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

Avec la valeur de retour facultative, puis-je l’obtenir pour renvoyer une [chaîne] au lieu d’une [chaîne?] D’une manière élégante - n’est-il pas possible de laisser la carte renvoyer uniquement des valeurs non null d’une manière ou d’une autre dans une syntaxe concise?

Aussi, existe-t-il une meilleure syntaxe pour map qui me permet de nommer les paramètres au lieu d'utiliser $ 0?

Réponses:

3 pour la réponse № 1

J'utilise Alamofire avec SwiftyJSON pour effectuer le travail et désérialiser un tableau d'objets JSON en objets natifs. Voici un exemple de la façon dont je le fais:

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)
}
}
}

Deserialize concerts ressemble à ceci:

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
}

Et enfin, ConcertModel initialiser mappe simplement les valeurs de NSDictionary aux propriétés de l'objet ConcertModel.


1 pour la réponse № 2

Mise à jour de l'implémentation pour 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!)
}
}
}

Cela analysera cette entrée JSON:

{
data: [
{ name: "John" },
{ name: "Dave" }
]
}