Ich habe wirklich Probleme damit, eine JSON-Datei in Swift einzulesen, damit ich damit herumspielen kann. Ich habe den größten Teil von 2 Tagen damit verbracht, verschiedene Methoden erneut zu suchen und auszuprobieren, aber noch kein Glück. Deshalb habe ich mich bei StackOverFlow angemeldet, um zu sehen, ob mich jemand in die richtige Richtung weisen kann.
Meine JSON-Datei heißt test.json und enthält Folgendes:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
Die Datei wird direkt in den Dokumenten gespeichert und ich greife mit folgendem Code darauf zu:
let file = "test.json"
let dirs : String[] = NSSearchPathForDirectoriesInDomains(
NSSearchpathDirectory.DocumentDirectory,
NSSearchPathDomainMask.AllDomainMask,
true) as String[]
if (dirs != nil) {
let directories: String[] = dirs
let dir = directories[0]
let path = dir.stringByAppendingPathComponent(file)
}
var jsonData = NSData(contentsOfFile:path, options: nil, error: nil)
println("jsonData \(jsonData)" // This prints what looks to be JSON encoded data.
var jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: nil) as? NSDictionary
println("jsonDict \(jsonDict)") - This prints nil.....
Wenn mir jemand nur einen Schub in die richtige Richtung geben kann, wie ich die JSON-Datei de-serialisieren und in ein zugängliches Swift-Objekt einfügen kann, bin ich auf ewig dankbar!
Mit freundlichen Grüßen,
Krivvenz.
path
ist es nur imif
Bereich sichtbar und ungelöst, wenn Sie es in verwendenNSData(contentsOfFile, options, error)
. Sie haben auch Tippfehler in Aufzählungsnamen.Antworten:
Folgen Sie dem folgenden Code:
Das Array "Personen" enthält alle Daten für die Schlüsselperson. Iterieren Sie durch, um es zu holen.
Swift 4.0:
quelle
Wenn jemand nach SwiftyJSON sucht Antwort:
Update:
Für
Swift 3/4
:quelle
url(forResource
in(NS)Bundle
dem zusätzlichen Schritt zu vermeiden , dass die URL zu erstellenSwift 4 mit Decodable
Swift 3
quelle
Xcode 8 Swift 3 liest json aus dem Datei-Update:
quelle
Aktualisierte Namen für Swift 3.0
Basierend auf Abhisheks Antwort und Druvas Antwort
quelle
Vereinfachung des Beispiels von Peter Kreinz. Funktioniert mit Swift 4.2.
Die Erweiterungsfunktion:
Das Beispielmodell:
Die Beispielverwendung:
Das Beispiel funktioniert auch mit Arrays:
Beachten Sie, dass wir keine unnötigen Generika bereitstellen, sodass wir das Ergebnis der Analyse nicht umsetzen müssen.
quelle
Schnelle 2.1-Antwort (basierend auf Abhisheks):
quelle
Ausgabe:
quelle
Das hat bei mir super geklappt
quelle
Hier ist meine Lösung mit SwiftyJSON
quelle
👆🏻 Copy-Paste-fähige, Framework-unabhängige Lösung von Drittanbietern.
Verwendung 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
quelle
Ich gebe eine andere Antwort, da keiner der hier darauf ausgerichtet ist, die Ressource aus dem Testpaket zu laden. Wenn Sie einen Remotedienst verwenden, der JSON ausgibt, und die Ergebnisse in einem Unit-Test analysieren möchten, ohne den eigentlichen Dienst zu treffen, nehmen Sie eine oder mehrere Antworten und legen sie in Dateien im Ordner "Tests" Ihres Projekts ab.
Dies verwendet auch SwiftyJSON, aber die Kernlogik zum Abrufen des Testpakets und zum Laden der Datei ist die Antwort auf die Frage.
quelle
Swift 4: Probieren Sie meine Lösung aus:
quelle
fromJSON
Erweiterungsfunktion wird ausgelöst, im Beispiel wird sie jedoch ohne dastry
Schlüsselwort aufgerufen . Dieser Code wird nicht kompiliert.fromJSON
Sie eine Dekodierbare Erweiterung verwenden, aber verwenden Sie keine Informationen aus dem Dekodierbare Typ , aber zusätzliche (völlig nutzlos) Generika.Neueste Swift 3.0 funktioniert absolut
quelle
Swift 4
JSON
toClass
withDecodable
- für diejenigen, die Klassen bevorzugenDefinieren Sie die Klassen wie folgt:
Verwendung, ziemlich abstrakt:
Dies ermöglicht Methoden für beide
People
undPerson
Klassen, Variablen (Attribute) und Methoden könnenprivate
bei Bedarf auch markiert werden.quelle
Aktualisiert für Swift 3 auf sicherste Weise
quelle
Der folgende Code funktioniert für mich. Ich benutze Swift 5
Wenn Ihre Personenstruktur (oder Klasse) dekodierbar ist (und auch alle ihre Eigenschaften), können Sie einfach Folgendes tun:
Ich habe den gesamten Fehlerbehandlungscode vermieden, um den Code besser lesbar zu machen.
quelle
Basierend auf Abhisheks Antwort wäre dies für iOS 8:
quelle
Dies funktionierte bei mir mit XCode 8.3.3
quelle
Swift 4.1 Aktualisierter Xcode 9.2
quelle
NSData
in Swift 3+ verwenden und.allowFragments
ist in diesem Fall sinnlos.quelle
Swift 5.1, Xcode 11
Sie können dies verwenden:
quelle
Ich habe den folgenden Code verwendet, um JSON aus der im Projektverzeichnis vorhandenen Datei FAQ-data.json abzurufen.
Ich implementiere in Xcode 7.3 mit Swift.
Struktur der JSON-Datei:
quelle
Ich könnte auch Ray Wenderlichs Swift JSON Tutorial empfehlen (das auch die großartige SwiftyJSON-Alternative Gloss behandelt ). Ein Auszug (der von sich aus das Poster nicht vollständig beantwortet, aber der Mehrwert dieser Antwort ist der Link, also bitte keine -1 dafür):
Natürlich tippen Sie in XCode 8.x einfach zweimal auf die Leertaste und sagen "Hey, Siri, bitte deserialisieren Sie diesen JSON für mich in Swift 3.0 mit Leerzeichen / Tabulatoren."
quelle
SWIFTYJSON VERSION SWIFT 3
quelle
Erstellen Sie zuerst eine Struc-Codierbarkeit wie folgt:
Deklarieren Sie nun die Variable
Aus dem Hauptverzeichnis lesen
Lesen Sie aus dem Internet
quelle
Verwenden Sie diese generische Funktion
mit dieser Codezeile:
für diesen Typ:
quelle