Saya memiliki string JSON (dari PHP json_encode()
yang terlihat seperti ini:
[{"id": "1", "name":"Aaa"}, {"id": "2", "name":"Bbb"}]
Saya ingin menguraikan ini menjadi semacam struktur data untuk aplikasi iPhone saya. Saya kira hal terbaik bagi saya adalah memiliki array kamus, jadi elemen 0 dalam array adalah kamus dengan kunci "id" => "1"
dan "name" => "Aaa"
.
Saya tidak mengerti bagaimana NSJSONSerialization
menyimpan data. Ini kode saya sejauh ini:
NSError *e = nil;
NSDictionary *JSON = [NSJSONSerialization
JSONObjectWithData: data
options: NSJSONReadingMutableContainers
error: &e];
Ini adalah sesuatu yang saya lihat sebagai contoh di situs web lain. Saya telah mencoba membaca JSON
objek dengan mencetak sejumlah elemen dan hal-hal seperti itu, tetapi saya selalu mengerti EXC_BAD_ACCESS
.
Bagaimana saya menggunakan NSJSONSerialization
untuk mem-parse JSON di atas, dan mengubahnya menjadi struktur data yang saya sebutkan?
ios
objective-c
json
nsdictionary
Logan Serman
sumber
sumber
Jawaban:
Objek json root Anda bukan kamus tetapi array:
Ini mungkin memberi Anda gambaran yang jelas tentang cara menanganinya:
sumber
[JSON count]
mengembalikan sesuatu, bukan hanya memberi saya EXC_BAD_ACCESS?!jsonArray
dan mencetak kesalahan. Ini akan menampilkan kesalahan apa pun yang terjadi selama penguraian.jsonArray
itu harus autorelease.Ini adalah kode saya untuk memeriksa apakah json yang diterima adalah array atau kamus:
Saya telah mencoba ini untuk opsi: kNilOptions dan NSJSONReadingMutableContainers dan berfungsi dengan benar untuk keduanya.
Jelas, kode aktual tidak bisa seperti ini di mana saya membuat pointer NSArray atau NSDictionary di dalam blok if-else.
sumber
Ini bekerja untuk saya.
data
Objek Anda mungkinnil
dan, seperti yang dicatat rckoenes, objek root harus berupa array (bisa berubah). Lihat kode ini:(Saya harus melarikan diri dari kutipan dalam string JSON dengan garis miring terbalik.)
sumber
Kode Anda tampak baik-baik saja kecuali hasilnya adalah
NSArray
, bukanNSDictionary
, di sini adalah contoh:Dua baris pertama hanya membuat objek data dengan JSON, sama seperti Anda akan membacanya dari internet.
Konten NSLog (daftar kamus):
sumber
NSJSONReadingMutableLeaves
"Menentukan bahwa string daun dalam grafik objek JSON dibuat sebagai instance dari NSMutableString."NSJSONReadingMutableContainers
:: "Menentukan bahwa array dan kamus dibuat sebagai objek yang dapat diubah."Di data JSON di atas, Anda menunjukkan bahwa kami memiliki larik yang berisi jumlah kamus.
Anda perlu menggunakan kode ini untuk menguraikannya:
Untuk swift 3/3 +
sumber
Kode berikut mengambil objek JSON dari server web, dan mem-parsingnya ke NSDictionary. Saya telah menggunakan API openweathermap yang mengembalikan respons JSON sederhana untuk contoh ini. Agar sederhana, kode ini menggunakan permintaan sinkron.
sumber
@ Arckoenes sudah menunjukkan kepada Anda cara mendapatkan data dengan benar dari string JSON.
Untuk pertanyaan yang Anda ajukan:
EXC_BAD_ACCESS
hampir selalu muncul ketika Anda mencoba mengakses objek setelah [otomatis] dirilis. Ini tidak khusus untuk serialisasi JSON [de-] tetapi, lebih tepatnya, hanya berkaitan dengan Anda mendapatkan objek dan kemudian mengaksesnya setelah dirilis. Fakta bahwa itu datang melalui JSON tidak masalah.Ada banyak-banyak halaman yang menjelaskan cara men-debug ini - Anda ingin Google (atau SO)
obj-c zombie objects
dan, khususnyaNSZombieEnabled
,, yang akan terbukti sangat berharga bagi Anda dalam membantu menentukan sumber objek zombie Anda. ("Zombie" adalah sebutannya ketika Anda melepaskan objek tetapi menyimpan pointer ke sana dan mencoba untuk referensi nanti.)sumber
Swift 2.0 pada Xcode 7 (Beta) dengan blok do / try / catch:
sumber
CATATAN: Untuk Swift 3 . String JSON Anda mengembalikan Array alih-alih Kamus. Silakan coba yang berikut ini:
sumber
sumber
Masalahnya tampaknya dengan autorelease objek. NSJSONSerialization JSONObjectWithData jelas membuat beberapa objek autoreleased dan meneruskannya kembali kepada Anda. Jika Anda mencoba untuk mengaktifkannya pada utas yang berbeda, itu tidak akan berhasil karena tidak dapat dibatalkan alokasi pada utas yang berbeda.
Triknya adalah mencoba melakukan salinan kamus atau larik yang dapat diubah dan menggunakannya.
Memperlakukan NSDictionary sebagai NSArray tidak akan menghasilkan pengecualian akses yang buruk tetapi malah akan crash ketika pemanggilan metode dilakukan.
Juga, mungkin opsi tidak terlalu penting di sini tetapi lebih baik untuk memberikan NSJSONReadingMutableContainers | NSJSONReadingMutableContainers | NSJSONReadingAllowFragments tetapi bahkan jika mereka adalah objek autoreleased mungkin tidak memecahkan masalah ini.
sumber
contoh buruk, harus seperti ini {"id": 1, "name": "something as name"}
angka dan string dicampur.
sumber