2016-04-05 12 views
1

Ich bin neu in Swift und JSON und habe Probleme. Ich habe mir alle möglichen Q & A's angeschaut und versucht den Rat einzubauen, aber schaffe es nicht richtig zu tun.Swift JSON Serialisierungsfehler

Ich habe den Server generieren JSON, die in Ordnung ist nach einem JSON Flusenprüfer (http://jsonlint.com).

einen Browser verwenden, ist die Antwort so:

[{ "Postalcode": "NW4 2JL"}, { "Postalcode": "NW4 2ES"}, { "Postalcode": "NW4 3XP"} , {"PostalCode": "NW4 4DU"}, {"PostalCode": "NW4 2HH"}, {"PostalCode": "NW4 2DR"}, {"PostalCode": "NW4 2DX"}]

Xcode gibt mir jedoch diesen Fehler:

Fehler, konnte nicht JSON parsen: Optional ([{"PostalCode": "NW4 2JL"}, {"PostalCode": "NW4 2ES"}, {"PostalCode" : "NW4 3XP"}, {"PostalCode": "NW4 4DU"}, {"PostalCode": "NW4 2HH"}, {"PostalCode": "NW4 2DR"}, {"PostalCode": "NW4 2DX"} ])

Was mich verwirrt, und ich kann keine Erklärung dafür finden, ist der 'Optional()' Teil. Davor ist die Fehlerbeschreibung so, wie ich sie geschrieben habe, in Zeile 12 (die einzige Nachricht, die das Wort 'sorry' enthält). Der JSON in der '()' sieht gut aus.

Kann mir jemand mitteilen, was ich hier falsch gemacht habe oder wo der 'Optional()' Text herkommt?

Dies ist der relevante Teil meines Codes:

let task = session.dataTaskWithRequest(request) { data, response, error in 
     guard data != nil else { 
      print("no data found: \(error)") 
      return 
     } 
     do { 
      if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as? NSDictionary { 
       let success = json["success"] as? Int 
       print("Success: \(success)") 
      } else { 
       let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print("Error, sorry, could not parse JSON: \(jsonStr)") 
      } 
     } catch let parseError { 
      print(parseError) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
     } 
    } 
+0

@Eric D: optionals könnte auch transitorisch sein, ich nehme an, sie sind da hinten kompatibel, nicht weil sie schlau sind –

+0

@IanBell Optionals sind ein Schlüsselkonzept in Swift, Chris Lattner hat dies mehrfach gesagt. Sie gehen bald nirgendwohin. :) – Moritz

+0

Wow, diese Seite ist gut. Sobald ich das gepostet habe, fand ich die Antwort woanders (http://stackoverflow.com/questions/8356842/how-to-use-nsjsonserialization). Wirklich leid. Die Lösung bestand darin, NSArray anstelle von NSDictionary zu verwenden, da die Antwort ein Array war. – Denis

Antwort

0

Mit dieser Zeile:

let success = json["success"] as? Int 

Sie machen success ein Optional. Und da Optionale dem Protokoll CustomStringConvertible entsprechen, erhalten Sie "Optional (...)" als Zeichenfolge. Wenn Sie noch nicht wissen, was ist ein Optional, stoppen Sie alles und gehen Sie dazu lernen Jetzt. ;)

Fertig? OK, jetzt sicher das optionale mit, zum Beispiel, optionale Bindung auspacken:

Das ist es.

Beachten Sie, dass hier zugreifst wir einen Wörterbuch, aber in Ihrer JSON-Frage ist ein Array von Wörterbuch: es ist ein wenig unklar, was Sie tatsächlich haben.