/ / wie man eine Sammlung aus einer Alamofire-Anfrage deserialisiert - schnell, Alamofire

wie man eine Sammlung aus einer Alamofire-Anfrage deserialisiert - swift, alamofire

Dies ist eine ziemlich grundlegende Frage der Syntax zum Deserialisieren der Antwortsammlung in Alamofire und Swift

Ich habe einen GET-Dienst, der ein Array von Benutzerobjekten zurückgibt, z.

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

und hier ist meine Bitte

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

Meine Frage ist, wie das Ergebnis deserialisiert werden soll, und ob ich davon ausgehe, dass es sich bei dem json-Ergebnis um ein [Dictionary] handelt. Soll ich es in ein [String] -Ergebnis umwandeln, um es zuzuordnen?

Wenn ich die unten stehende Kartensyntax verwende, habe ich ein paar Fragen

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

Kann ich mit dem optionalen Rückgabewert veranlassen, dass ein [String] anstelle eines [String?] Ordnungsgemäß zurückgegeben wird? Gibt es keine Möglichkeit, Map in einer kurzen Syntax nur Werte ungleich Null zurückgeben zu lassen?

Gibt es auch eine bessere Syntax für Map, mit der ich die Parameter benennen kann, anstatt $ 0 zu verwenden?

Antworten:

3 für die Antwort № 1

Ich verwende Alamofire mit SwiftyJSON, um die Aufgabe zu erledigen und das Array von JSON-Objekten in native Objekte zu deserialisieren. Hier ist ein Beispiel, wie ich es mache:

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 konzerte sieht so aus:

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
}

Und schlussendlich, ConcertModel Der Initialisierer ordnet nur die Werte des NSDictionary den Eigenschaften des ConcertModel-Objekts zu.


1 für die Antwort № 2

Aktualisierte Implementierung für 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!)
}
}
}

Dadurch wird diese JSON-Eingabe analysiert:

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