2016-12-29 2 views
1

Ich versuche, JSON-Daten mit Swift aus Guidebox zu analysieren. Ein Beispiel für die Daten wie folgt aus:JSON-Daten in Swift von der Guidebox-API aus analysieren

{ 
    "results": [ 
    { 
     "id": 14673, 
     "title": "The Golden Girls", 
     "alternate_titles": [ 
     "Golden Palace" 
     ], 
     "container_show": 0, 
     "first_aired": "1985-09-14", 
     "imdb_id": "tt0088526", 
     "tvdb": 71292, 
     "themoviedb": 1678, 
     "freebase": "\/m\/01fszq", 
     "wikipedia_id": 217200, 
     "tvrage": { 
     "tvrage_id": 5820, 
     "link": "http:\/\/www.tvrage.com\/shows\/id-5820" 
     }, 
     "artwork_208x117": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_small\/14673-9570342022-208x117-show-thumbnail.jpg", 
     "artwork_304x171": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_medium\/14673-3759246217-304x171-show-thumbnail.jpg", 
     "artwork_448x252": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_large\/14673-2249565586-448x252-show-thumbnail.jpg", 
     "artwork_608x342": "http:\/\/static-api.guidebox.com\/120214\/thumbnails_xlarge\/14673-6064109057-608x342-show-thumbnail.jpg" 
    } 
    ], 
    "total_results": 1, 
    "development_api_key": "You are currently using a temporary development API key. This API key is for testing only. You have used 57 of 250 available calls. Please see the API docs (http:\/\/api.guidebox.com\/apidocs) for additional information or to generate a production API key." 
} 

Es scheint, dass für meinen Fall, der einfachste Weg, um die Daten zu verwenden, würde es [Zeichenfolge: Jeder] zu konvertieren, da alles, was ich wirklich brauchen „id "," title "und ein Artwork-Wert. Allerdings versagen all die (unzähligen) Methoden, die ich verwendet habe, weil "alternate_titles" als NSArray geparst wird und alles schwieriger macht. Bisher habe ich versucht, Variationen dieser Methode:

 do { 
     let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
     let datafinal = jsonResult["results"] as! [String: Any] 
//Fails around here usually, when the data is converted to [String: Any] or [Any:Any] because of the array. 
     let title = datafinal["title"] 
     } catch { 
      print("JSON Preocessing failed") 
     } 

Ich habe auch die SwiftyJSON Bibliothek, um zu versuchen, die Daten zu leichter lesbar JSON zu konvertieren, aber die Methoden, um ein Wörterbuch zu ziehen aus ihm immer scheitern (Ich vermute aufgrund der Struktur auch). Jeder hat eine einfache Methode, um die JSON-Daten von der URL zu erhalten und einfach auf die Werte in "Ergebnisse" zuzugreifen? Jede Hilfe wird sehr geschätzt!

+0

können Sie Ihre Bemühungen teilen? –

+0

Versuchen Sie dies 'do { Lassen Sie jsonResult = JSONSerialization.jsonObject ausprobieren (mit: Daten !, Optionen: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Beliebig] lass Datafinal = jsonResult ["results"] as! NSArary // Fails hier in der Regel, wenn die Daten wegen des Arrays in [String: Any] oder [Any: Any] konvertiert werden. let title = datafinal [0] .value (forKey: "title") print ("\ (Titel)") } catch { print ("JSON Bearbeitungen fehlgeschlagen") } ' –

+0

eine Modellklasse erstellen und analysieren Es verwendet Objekt Mapper. –

Antwort

0

Versuchen Sie, diese

do { 
    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
    let datafinal = jsonResult["results"] as! NSArary 

    let title = datafinal[0].value(forKey: "title") 
    print("\(title)") 
     } catch { 
      print("JSON Preocessing failed") 
     } 
+0

Könnte bitte eine Beschreibung zu Ihrer Lösung hinzufügen? – dirtydanee

+0

@dirtydanee mein Verständnis, er will nur Titel von nur einem Index-Array, das Ergebnisse ist. Im nächsten Schritt hat er ein Wörterbuch innerhalb des Arrays bei 'index 0' und ich hole den Wert für den Schlüsseltitel 'let title = datafinal [0] .value (forKey: "title") '. Entschuldigung mein Englisch ist nicht sehr gut, auf Ihre Weise ist Ihre Antwort auch gut. :) –

0

Alles, was Sie tun müssen, ist Zugriff auf Ergebnisse als array, und nehmen Sie die first element der array, was ist eine Dictionary.

In Zukunft, here ist ein großartiges Werkzeug, mit dem Sie die Struktur Ihrer Daten bequemer überprüfen können, und es könnte dieses Problem schneller aufdecken.

do { 
    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String: Any] 
    guard let results = jsonResult["results"] as? [Any], let resultDictinary = results.first as? [String: Any] else { 
     fatalError("Data structure invalid") 
    } 
    let title = resultDictinary["title"] 
} catch { 
    print("JSON Preocessing failed") 
} 
+0

Ich glaube, das würde funktionieren, aber es gab einige Verwirrung in der Compiler über die Guard-Anweisung und wie es eingerichtet wurde (ich denke, die beiden Leads waren es verwirrend). Trotzdem danke! Außerdem liebe ich dieses Tool, mein Problem war hauptsächlich, wie man darauf zugreifen kann. –

+0

Ahh ja, das funktioniert! –

Verwandte Themen