Naprawdę mam problem z odczytaniem pliku JSON w Swift, aby móc się nim bawić. Spędziłem najlepszą część 2 dni na ponownym wyszukiwaniu i wypróbowywaniu różnych metod, ale na razie nie mam szczęścia, więc zapisałem się do StackOverFlow, aby sprawdzić, czy ktoś może skierować mnie w dobrym kierunku .....
Mój plik JSON nazywa się test.json i zawiera następujące elementy:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
Plik jest zapisywany bezpośrednio w dokumentach i uzyskuję do niego dostęp za pomocą następującego kodu:
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.....
Jeśli ktokolwiek może po prostu popchnąć mnie we właściwym kierunku, jak mogę dokonać serializacji pliku JSON i umieścić go w dostępnym obiekcie Swift, będę wiecznie wdzięczny!
Z poważaniem,
Krivvenz.
path
jest widoczny tylko wif
zakresie i nierozwiązany, gdy go używaszNSData(contentsOfFile, options, error)
; masz także literówki w nazwach enum.Odpowiedzi:
Postępuj zgodnie z poniższym kodem:
Tablica „osoby” będzie zawierać wszystkie dane dla kluczowej osoby. Iteruj przez, aby go pobrać.
Swift 4.0:
źródło
Jeśli ktoś szuka SwiftyJSON Odpowiedź:
Aktualizacja:
Dla
Swift 3/4
:źródło
url(forResource
w(NS)Bundle
celu uniknięcia dodatkowego kroku, aby utworzyć URLSwift 4 przy użyciu dekodowania
Szybki 3
źródło
Xcode 8 Swift 3 odczytał json z aktualizacji pliku:
źródło
Zaktualizowano nazwy dla Swift 3.0
Na podstawie odpowiedzi na Abhishek i odpowiedzi Druva za
źródło
Uproszczenie przykładu dostarczonego przez Petera Kreinza. Działa z Swift 4.2.
Funkcja rozszerzenia:
Przykładowy model:
Przykładowe użycie:
Przykład będzie również działał z tablicami:
Zauważ, że nie zapewniamy żadnych niepotrzebnych składników ogólnych, dlatego nie musimy rzutować wyniku analizy.
źródło
Odpowiedź Swift 2.1 (na podstawie Abhisheka):
źródło
Wynik:
źródło
Działa to świetnie ze mną
źródło
Oto moje rozwiązanie wykorzystujące SwiftyJSON
źródło
Ready gotowe do kopiowania i wklejania, niezależne od frameworka rozwiązanie niezależne.
użycie 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
źródło
Podaję inną odpowiedź, ponieważ żaden z nich nie ma na celu załadowania zasobu z pakietu testowego. Jeśli korzystasz ze zdalnej usługi, która wysyła JSON i chcesz przeprowadzić test jednostkowy parsowania wyników bez trafienia w rzeczywistą usługę, bierzesz jedną lub więcej odpowiedzi i umieszczasz je w plikach w folderze Testy w swoim projekcie.
To również używa SwiftyJSON, ale podstawowa logika pobierania pakietu testowego i ładowania pliku jest odpowiedzią na pytanie.
źródło
Swift 4: Wypróbuj moje rozwiązanie:
źródło
fromJSON
funkcja rozszerzenia rzuca, ale w przykładzie wywołujesz ją beztry
słowa kluczowego. Ten kod nie będzie się kompilował.fromJSON
jeśli używasz rozszerzenia Decodable, nie używasz żadnych informacji z typu Decodable, ale zapewniasz dodatkowe (całkowicie bezużyteczne) generyczne.Najnowszy swift 3.0 absolutnie działa
źródło
Przesuń 4
JSON
naClass
zDecodable
- dla tych, którzy wolą zajęciaZdefiniuj klasy w następujący sposób:
Zastosowanie, dość abstrakcyjne:
Pozwala to na metody zarówno dla klas, jak
People
iPerson
zmiennych, atrybutów i metod, które mogą być również oznaczone wprivate
razie potrzeby.źródło
Poniższy kod działa dla mnie. Używam Swift 5
Następnie, jeśli Twoja Struktura Osoby (lub Klasa) jest Dekodowalna (a także wszystkie jej właściwości), możesz po prostu zrobić:
Unikałem całego kodu obsługi błędów, aby kod był bardziej czytelny.
źródło
Zaktualizowano dla Swift 3 w najbezpieczniejszy sposób
źródło
Swift 5.1, Xcode 11
Możesz użyć tego:
źródło
W oparciu o odpowiedź Abhisheka dla iOS 8 byłoby to:
źródło
Działa to dla mnie z XCode 8.3.3
źródło
Swift 4.1 Zaktualizowano Xcode 9.2
źródło
NSData
w Swift 3+,.allowFragments
w tym przypadku nie ma sensu.źródło
Użyłem poniższego kodu, aby pobrać JSON z pliku FAQ-data.json znajdującego się w katalogu projektu.
Wdrażam w Xcode 7.3 za pomocą Swift.
Struktura pliku JSON:
źródło
Mogę również polecić samouczek JSON Swift Ray Wenderlicha (który obejmuje również niesamowitą alternatywę SwiftyJSON, Połysk ). Fragment (który sam w sobie nie odpowiada w pełni na plakat, ale wartością dodaną tej odpowiedzi jest link, więc proszę nie -1 za to):
Oczywiście w XCode 8.x wystarczy dwukrotnie stuknąć spację i powiedzieć „Hej, Siri, proszę deserializować JSON dla mnie w Swift 3.0 z wcięciami / tabulatorami”.
źródło
SWIFTYJSON WERSJA SWIFT 3
źródło
Najpierw utwórz kod Struc, taki jak ten:
Teraz zadeklaruj zmienną
Czytaj z głównego katalogu
Czytaj z sieci
źródło
Użyj tej funkcji ogólnej
z tym wierszem kodu:
dla tego typu:
źródło