2017-11-15 4 views
1

Ich benutze Swift 4, um json von einem URLSession-Aufruf zurückgegeben verarbeiten. Der JSON wird nach dem Aufruf in einem Wörterbuch (Cache des Typs) gespeichert, wobei die URL-Zeichenfolge als Schlüssel verwendet wird. Ich möchte dann den JSON zu einem benutzerdefinierten Objekt namens ApodJSON verarbeiten. Manchmal ist der zurückgegebene json ein Array meines ApodJSON-Objekts und manchmal sein einziger ApodJSON.Wie überprüfen, ob JSON-Rückgabewert in Form eines Arrays oder eines Wörterbuchs ist

wenn ich Swifts neue JsonDecoder verwenden images = try JSONDecoder().decode([ApodJSON].self, from: data) Ich erhalte eine Fehlermeldung, wenn die json zuvor Code ein einzelnes Objekt also wieder „Expected Array zu entschlüsseln, aber einen Wörterbuch statt gefunden.“

Wie kann ich überprüfen, ob die JSON-Daten ist ein Array von JSON-Daten oder ein indiviual Artikel in Wörterbuch Format mir zu erlauben, die entsprechende JSONDecoder Methode aufzurufen. Die folgenden Check wenn Daten Array funktionieren nicht

// parse json to ApodJSON class object if success true 
func processJSON(success: Bool) { 
    // get the data stored in cache dic and parse to json 
    // data is of type Data 
    guard let data = self.dataForURL(url: self.jsonURL), success == true else { return } 
    do { 
     var images: [ApodJSON] = [] 
     // check if data is an array of json image data or an indiviual item in dictionary format 
     if data is Array<Any> { 
      images = try JSONDecoder().decode([ApodJSON].self, from: data) 
     } else { 
      let image = try JSONDecoder().decode(ApodJSON.self, from: data) 
      images.append(image) 
     } 
     for image in images { 
      print("ImageUrls: \(String(describing: image.url))") 
     } 
    } catch let jsonError { 
     print(jsonError) 
    } 
} 

Antwort

1
func processJSON(success: Bool) { 
    // get the data stored in cache dic and parse to json 
    // data is of type Data 
    guard let data = self.dataForURL(url: self.jsonURL), success == true else { return } 
    var images: [ApodJSON] = [] 
    do { 
     // try to decode it as an array first 
     images = try JSONDecoder().decode([ApodJSON].self, from: data) 
     for image in images { 
      print("ImageUrls: \(String(describing: image.url))") 
     } 
    } catch let jsonError { 
     print(jsonError) 
     //since it didn't work try to decode it as a single object 
     do{ 
      let image = try JSONDecoder().decode(ApodJSON.self, from: data) 
      images.append(image) 
     } catch let jsonError{ 
      print(jsonError) 
     } 
    } 
} 
+0

ja, die thx gearbeitet. Ich bin mir nicht sicher, ob es andere Möglichkeiten gibt, Upfront zu überprüfen, aber das hat erreicht, was ich versucht habe zu tun – lozflan

Verwandte Themen