Saya benar-benar berjuang dengan mencoba membaca file JSON ke Swift sehingga saya bisa bermain dengannya. Saya telah menghabiskan bagian terbaik dari 2 hari mencari kembali dan mencoba metode yang berbeda tetapi belum beruntung, jadi saya telah mendaftar ke StackOverFlow untuk melihat apakah ada yang bisa mengarahkan saya ke arah yang benar .....
File JSON saya disebut test.json dan berisi yang berikut ini:
{
"person":[
{
"name": "Bob",
"age": "16",
"employed": "No"
},
{
"name": "Vinny",
"age": "56",
"employed": "Yes"
}
]
}
File disimpan dalam dokumen secara langsung dan saya mengaksesnya menggunakan kode berikut:
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.....
Jika ada yang bisa memberi saya dorongan ke arah yang benar tentang bagaimana saya bisa menderialisasi file JSON dan meletakkannya di objek Swift yang dapat diakses, saya akan sangat berterima kasih!
Salam,
Krivvenz.
path
hanya terlihat dalamif
lingkup, dan tidak terselesaikan ketika Anda menggunakannyaNSData(contentsOfFile, options, error)
; Anda juga memiliki kesalahan ketik dalam nama enum.Jawaban:
Ikuti kode di bawah ini:
Array "orang" akan berisi semua data untuk orang kunci. Iterasi melalui untuk mengambilnya.
Swift 4.0:
sumber
Jika ada yang mencari SwiftyJSON Jawab:
Pembaruan:
Untuk
Swift 3/4
:sumber
url(forResource
di(NS)Bundle
untuk menghindari langkah ekstra untuk membuat URLSwift 4 menggunakan Decodable
Cepat 3
sumber
Xcode 8 Swift 3 membaca json dari pembaruan file:
sumber
Nama yang diperbarui untuk Swift 3.0
Berdasarkan jawaban Abhishek dan jawaban Druva
sumber
Menyederhanakan contoh yang diberikan oleh Peter Kreinz. Bekerja dengan Swift 4.2.
Fungsi ekstensi:
Model contoh:
Contoh penggunaan:
Contoh ini juga akan bekerja dengan array:
Perhatikan bagaimana kami tidak menyediakan obat generik yang tidak perlu, jadi kami tidak perlu memberikan hasil penguraian.
sumber
Swift 2.1 menjawab (berdasarkan pada Abhishek):
sumber
Keluaran:
sumber
Ini sangat membantu saya
sumber
Ini solusi saya menggunakan SwiftyJSON
sumber
👆🏻 copy-paste siap, solusi pihak ketiga kerangka independen
penggunaan 👇🏻
let json:[[String : AnyObject]] = loadJSON(name: "Stations")!
sumber
Saya memberikan jawaban lain karena tidak ada yang di sini diarahkan memuat sumber daya dari bundel tes. Jika Anda menggunakan layanan jarak jauh yang mengeluarkan JSON dan ingin menguji unit parsing hasil tanpa memukul layanan yang sebenarnya, Anda mengambil satu atau lebih tanggapan dan memasukkannya ke dalam file di folder Tes di proyek Anda.
Ini juga menggunakan SwiftyJSON tetapi logika inti untuk mendapatkan bundel uji dan memuat file adalah jawaban untuk pertanyaan itu.
sumber
Swift 4: Coba solusi saya:
sumber
fromJSON
Fungsi ekstensi Anda melempar, namun dalam contoh Anda menyebutnya tanpatry
kata kunci. Kode ini tidak akan dikompilasi.fromJSON
Anda menggunakan ekstensi Decodable, namun Anda tidak menggunakan informasi apa pun dari jenis Decodable tetapi memberikan tambahan (benar-benar tidak berguna) generik.Swift 3.0 terbaru benar-benar berfungsi
sumber
Swift 4
JSON
untukClass
denganDecodable
- untuk mereka yang lebih kelasTentukan kelas sebagai berikut:
Penggunaan, cukup abstrak:
Ini memungkinkan metode untuk kelas
People
danPerson
, variabel (atribut) dan metode juga dapat ditandai seolah-private
olah diperlukan.sumber
Kode berikut ini berfungsi untuk saya. Saya menggunakan Swift 5
Kemudian, jika Struct Person Anda (atau Kelas) adalah Decodable (dan juga semua propertinya), Anda dapat melakukannya:
Saya menghindari semua kode penanganan kesalahan untuk membuat kode lebih mudah dibaca.
sumber
Diperbarui untuk Swift 3 dengan cara teraman
sumber
Swift 5.1, Xcode 11
Anda bisa menggunakan ini:
sumber
Berdasarkan jawaban Abhishek , untuk iOS 8 ini adalah:
sumber
Ini bekerja untuk saya dengan XCode 8.3.3
sumber
Swift 4.1 Xcode Diperbarui 9.2
sumber
NSData
di Swift 3+, dan.allowFragments
tidak ada gunanya dalam hal ini.sumber
Saya telah menggunakan kode di bawah ini untuk mengambil JSON dari file FAQ-data.json yang ada di direktori proyek.
Saya menerapkan di Xcode 7.3 menggunakan Swift.
Struktur file JSON:
sumber
Saya mungkin juga merekomendasikan Tutorial Swift JSON milik Ray Wenderlich (yang juga mencakup alternatif SwiftyJSON yang mengagumkan, Gloss ). Kutipan (yang diberikan, dengan sendirinya, tidak sepenuhnya menjawab poster, tetapi nilai tambah dari jawaban ini adalah tautannya, jadi tidak ada -1 untuk itu, tolong):
Tentu saja, di XCode 8.x, Anda cukup mengetuk bilah spasi dan berkata, "Hai, Siri, tolong deserialisasi JSON ini untuk saya di Swift 3.0 dengan spasi / tab-indent."
sumber
SWIFTYJSON VERSION SWIFT 3
sumber
Pertama buat Struc codable seperti ini:
Sekarang deklarasikan variabelnya
Baca dari direktori utama
Baca dari web
sumber
Gunakan fungsi generik ini
dengan baris kode ini:
untuk tipe ini:
sumber