2016-07-24 15 views
0

Hier ist die JSON Ich bin vom Server bekommen:Wie erstelle ich ein Array von Objekten basierend auf einem Array von JSON-Objekten mit SwiftyJSON (in Swift)?

{ 
    "items": [ 
     { 
      "name": "Shampoo", 
      "price": 9 
     }, 
     ... 
    ] 
} 

Hier ist meine Item Klasse in Swift:

class Item { 
    var name: String 
    var price: Float 
    init(name: String, price: Float) { 
     self.name = name 
     self.price = price 
    } 
} 

Ich mag ein Item Objekt für jedes JSON-Objekt in den items Array erstellen SwiftyJSON mit . Also dachte ich, ich würde einfach das Swift-Array durchlaufen, das SwiftyJSON für mich erstellen wird und voila. SwiftyJSON gibt jedoch einen Fehler aus, der besagt, dass items kein Array ist. Ich habe versucht, es als Wörterbuch zu subskribieren, aber Sie können nicht (ich dachte, Sie könnten) ein Wörterbuch in einer For-Schleife durchlaufen.

Hier ist der Code, den ich versucht habe:

let json = JSON(data: data) // data is the JSON from the server (above) and isn't nil 
let items = json["items"].array // this is nil and where SwiftyJSON throws the error. 
// error checking and optional unwrapping etc. 
for item in items { 
    var itemsList: [Item] = [] 
    itemsList.append(Item(name: item["name"], price: item["price"])) 
} 

Ich fühle mich wie das ist ziemlich einfach sein sollte also wenn jemand finden kann, wo ich schief gelaufen Ich würde es wirklich schätzen. Vielen Dank!

+0

Versuchen Sie, 'json [" items "]' zu drucken und zu sehen, was es ist? – kennytm

+0

@kennytm Es sieht aus wie ein Tupel mit dem rohen JSON als String und Array, das null ist. – Jake

+0

überprüfen, ob das ursprüngliche JSON korrekt formatiert ist? – kennytm

Antwort

1

Auschecken ObjectMapper, es ist eine andere JSON-Parser-Bibliothek für swift. Es unterstützt das Mapping eines Arrays aus der Box.

erklären Sie Ihre Server-Response-Objekt wie:

class ServerResponse: Mappable { 
    var array: [Item]? 

    required init?(_ map: Map) { 

    } 

    // Mappable 
    func mapping(map: Map) { 
     array  <- map["items"] 
    } 
} 
+0

Das ist wirklich cool, aber ich kann es nicht wirklich verwenden, bis mein Problem gelöst ist, weil ich nicht auf die Daten von SwiftyJSON zugreifen kann, weil es einen Fehler zurückgibt, wenn ich versuche, ein Array aus meinem JSON-Array zu erstellen. – Jake

+0

Es ist eine Alternative zu SwiftyJSON, Sie sollten es stattdessen verwenden –

1

Dies ist, wie ich in meinem Projekt zu tun ...

guard let cityName = json["city"]["name"].string else {return} 
guard let cityID = json["city"]["id"].int else {return} 

var allForecasts = [Forecast]() 
guard let allStuff = json["list"].array else {return} 

     for f in allStuff { 
      guard let date = f["dt"].double else {continue} 
      let dateUnix = NSDate(timeIntervalSince1970: date) 
      guard let temp = f["main"]["temp"].double else {continue} 
      guard let tempMin = f["main"]["temp_min"].double else {continue} 
      guard let tempMax = f["main"]["temp_max"].double else {continue} 
      guard let pressure = f["main"]["pressure"].double else {continue} 
      guard let humidity = f["main"]["humidity"].double else {continue} 
      guard let description = f["weather"][0]["description"].string else {continue} 
      guard let icon = f["weather"][0]["icon"].string else {continue} 
      guard let wind = f["wind"]["speed"].double else {continue} 

    let weather = Forecast(temperature: temp, maximum: tempMax, minimum: tempMin, description: description, icon: icon, humidity: humidity, pressure: pressure, wind: wind, date: dateUnix) 

    allForecasts.append(weather) 
    } 

let fullWeather = City(cityID: cityID, cityName: cityName, forecasts: allForecasts) 

Ich denke, es hilfreich ist.

+0

Können Sie den JSON hinzufügen, den Sie analysieren? – Jake

+0

http://api.openweathermap.org/data/2.5/forecast?q=beograd&appid=7c0f97effa6938625b48aecf94e4501c Dies ist Link und fügen Sie es in jsonLint und Sie können sehen, wie Json aussehen mag. –

Verwandte Themen