2016-11-05 3 views
22

Ich habe eine JSON-Datei points.json, und eine Lesefunktion wie genannt:lesen JSON-Datei mit Swift 3

private func readJson() { 
    let file = Bundle.main.path(forResource: "points", ofType: "json") 
    let data = try? Data(contentsOf: URL(fileURLWithPath: file!)) 
    let jsonData = try? JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
    print(jsonData) 
} 

Es funktioniert nicht, jede mögliche Hilfe?

+1

Was funktioniert nicht? Fügen Sie einen 'do-catch'-Block hinzu, um Fehlerinformationen zu erhalten. "Bundle" hat übrigens eine URL-bezogene API zum Abrufen von Ressourcen. – vadian

Antwort

71

Ihr Problem hier ist, dass Sie zwingen, die Werte auszupacken und im Falle eines Fehlers können Sie nicht wissen, wo es herkommt.

Stattdessen sollten Sie Fehler behandeln und Ihre Optionals sicher auspacken.

Und wie @vadian richtig in seinem Kommentar notiert, sollten Sie Bundle.main.url verwenden.

private func readJson() { 
    do { 
     if let file = Bundle.main.url(forResource: "points", withExtension: "json") { 
      let data = try Data(contentsOf: file) 
      let json = try JSONSerialization.jsonObject(with: data, options: []) 
      if let object = json as? [String: Any] { 
       // json is a dictionary 
       print(object) 
      } else if let object = json as? [Any] { 
       // json is an array 
       print(object) 
      } else { 
       print("JSON is invalid") 
      } 
     } else { 
      print("no file") 
     } 
    } catch { 
     print(error.localizedDescription) 
    } 
} 

Wenn in Swift Codierung, in der Regel ist ! ein Code Geruch. Natürlich gibt es Ausnahmen (IBOutlets und andere), aber versuchen Sie nicht, sich mit ! selbst auszuwrappen und immer sicher auszupacken.

+0

Danke! Es wurde gedruckt "Die Daten konnten nicht gelesen werden, weil sie nicht im richtigen Format vorliegen.". – Xie

+1

Also ich denke, es ist das Problem mit der JSON-Datei – Xie

+2

Ja, das ist der 'catch', der den Fehler von JSONSerialization gefangen hat. Ihre JSON-Datei ist wahrscheinlich ungültig. Siehe: Immer Fehler behandeln. :) – Moritz