Apakah ini json yang valid?
{
"a" : "x",
"a" : "y"
}
http://jsonlint.com/ mengatakan ya.
http://www.json.org/ tidak mengatakan apa-apa tentang hal itu dilarang.
Tapi jelas itu tidak masuk akal, bukan? Sebagian besar implementasi mungkin menggunakan hashtable sehingga ditimpa.
Dictionary<string, string>
Jawaban:
Dari standar (p. Ii) :
Lebih jauh ke bawah dalam standar (hal. 2), spesifikasi untuk objek JSON:
Itu tidak menyebutkan kunci duplikat menjadi tidak valid atau valid, jadi menurut spesifikasi saya akan dengan aman menganggap itu berarti mereka diizinkan.
Bahwa sebagian besar implementasi perpustakaan JSON tidak menerima kunci duplikat tidak bertentangan dengan standar, karena kutipan pertama.
Berikut adalah dua contoh yang terkait dengan pustaka standar C ++. Ketika deserializing beberapa objek JSON menjadi
std::map
itu akan masuk akal untuk menolak kunci duplikat. Tetapi ketika deserializing beberapa objek JSON menjadistd::multimap
itu akan masuk akal untuk menerima kunci duplikat seperti biasa.sumber
std::multimap
contoh yang baru saja saya tambahkan. Ini dapat diserialisasi sebagai objek JSON dengan kunci duplikat yang berpotensi.{"a":1,"a":2}
adalah satu set dari dua pasangan kunci / nilai yang berbeda. Memang, bahkan{"a":1,"a":1}
dapat dianggap sebagai satu set pasangan kunci / nilai yang kebetulan hanya memiliki satu elemen. Fakta bahwa itu diulang dapat dianggap hanya sebagai kekhasan sintaksis. Definisi yang lebih baik adalah, "Objek adalah fungsi parsial dari string (nama) ke nilai."Jawaban singkatnya: Ya tapi tidak disarankan.
Jawaban panjang: Itu tergantung pada apa yang Anda sebut valid ...
ECMA-404 "Sintaks Interchange Data JSON" tidak mengatakan apa-apa tentang nama yang digandakan (kunci).
Namun, RFC 8259 "Format Interchange Data Notasi JavaScript (JSON)" mengatakan:
Dalam konteks ini HARUS harus dipahami sebagaimana ditentukan dalam BCP 14 :
RFC 8259 menjelaskan mengapa nama unik (kunci) bagus:
Juga, seperti yang ditunjukkan Serguei dalam komentar: ECMA-262 "Spesifikasi Bahasa ECMAScript®", berbunyi:
Dengan kata lain, nilai terakhir menang.
Mencoba mengurai string dengan nama duplikat dengan implementasi Java oleh Douglas Crockford (pembuat JSON) menghasilkan pengecualian :
sumber
d8 -e 'x={"a":1,"a":2}; print(x.a);'
Ini mencetak 2.JSON.parse()
secara eksplisit mengatakanIn the case where there are duplicate name Strings within an object, lexically preceding values for the same key shall be overwritten.
(dengan kata lain nilai terakhir menang).Ada 2 dokumen yang menentukan format JSON:
Kutipan yang diterima mengutip dari dokumen pertama. Saya pikir dokumen pertama lebih jelas, tetapi dokumen kedua berisi lebih banyak detail.
Dokumen ke-2 mengatakan:
Jadi tidak dilarang untuk memiliki nama duplikat, tetapi tidak dianjurkan.
sumber
Saya menemukan pertanyaan serupa ketika berhadapan dengan API yang menerima XML dan JSON, tetapi tidak mendokumentasikan bagaimana itu akan menangani apa yang Anda harapkan menjadi kunci duplikat di JSON yang diterima.
Berikut ini adalah representasi XML yang valid dari sampel JSON Anda:
Ketika ini dikonversi ke JSON, Anda mendapatkan yang berikut:
Pemetaan alami dari bahasa yang menangani apa yang Anda sebut kunci duplikat ke bahasa lain, dapat berfungsi sebagai referensi praktik terbaik potensial di sini.
Semoga itu bisa membantu seseorang!
sumber
Spesifikasi JSON mengatakan ini:
Bagian penting di sini adalah "tidak berurutan": itu menyiratkan keunikan kunci, karena satu-satunya hal yang dapat Anda gunakan untuk merujuk ke pasangan tertentu adalah kuncinya.
Selain itu, sebagian besar lib JSON akan membatalkan deserialisasi objek JSON ke peta / kamus hash, di mana kunci dijamin unik. Apa yang terjadi ketika Anda menghapus objek JSON dengan kunci duplikat tergantung pada pustaka: dalam kebanyakan kasus, Anda akan mendapatkan kesalahan, atau hanya nilai terakhir untuk setiap kunci duplikat yang akan diperhitungkan.
Misalnya, dalam Python,
json.loads('{"a": 1, "a": 2}')
mengembalikan{"a": 2}
.sumber
{ (a,b), (a,c) }
adalah satu set yang unik. Jadi secara teknis di bawah definisi json.org{"a":1,"a":2}
adalah valid tetapi{"a":1,"a":2,"a":1}
tidak. Perhatikan juga bahwa ECMA-404 (standar aktual) menghindari penggunaan kata "set":An object structure is represented as a pair of curly bracket tokens surrounding zero or more name/value pairs.
HARUS unik bukan berarti HARUS unik. Namun, seperti yang disebutkan, beberapa parser akan gagal dan yang lain hanya akan menggunakan nilai terakhir yang diuraikan. Namun, jika spek itu dibersihkan sedikit untuk memungkinkan duplikat maka saya bisa melihat penggunaan di mana Anda mungkin memiliki pengendali acara yang mengubah JSON menjadi HTML atau format lain ... dalam kasus seperti itu akan sangat valid untuk parsing JSON dan buat format dokumen lain ...
lalu bisa dengan mudah menguraikan ke html misalnya
Saya bisa melihat alasan di balik pertanyaan itu, tetapi seperti yang terjadi ... Saya tidak akan mempercayainya.
sumber
{"div":{"p":"hello","p":"universe"}, "div":{"h1":"Heading 1","p":"another paragraph"}}
,. Sekarang, banyak orang dan kerangka kerja memperlakukan objek JSON sebagai kamus yang tidak berurutan, tetapi JavaScript dan API MongoDB bergantung pada pengurutan kunci dalam kamus, jadi apa yang Anda sarankan (kamus yang dipesan) bukanlah hal yang tidak pernah terdengar. Anda hanya perlu parser khusus.Bertanya untuk tujuan, ada jawaban yang berbeda:
Menggunakan JSON untuk membuat objek bersambung (JavaScriptObjectNotation), setiap elemen kamus memetakan ke properti objek indivual, sehingga entri yang berbeda menentukan nilai untuk properti yang sama tidak memiliki arti.
Namun, saya menemukan pertanyaan yang sama dari kasus penggunaan yang sangat spesifik: Menulis sampel JSON untuk pengujian API, saya bertanya-tanya bagaimana cara menambahkan komentar ke file JSON kami tanpa merusak kegunaannya. Spesifikasi JSON tidak tahu komentar, jadi saya datang dengan pendekatan yang sangat sederhana:
Untuk menggunakan kunci duplikat untuk mengomentari sampel JSON kami . Contoh:
{ "property1" : "value1", "REMARK" : "... prop1 controls ...", "property2" : "value2", "REMARK" : "... value2 raises an exception ...", }
Serialisasi JSON yang kami gunakan tidak memiliki masalah dengan duplikat "KETERANGAN" ini dan kode aplikasi kami mengabaikan overhead kecil ini.
Jadi, meskipun tidak ada arti pada lapisan aplikasi, duplikat ini bagi kami memberikan solusi yang berharga untuk menambahkan komentar ke sampel pengujian kami tanpa memutus kegunaan JSON.
sumber
Posting dan jawab karena ada banyak ide usang dan kebingungan tentang standar. Pada Desember 2017, ada dua standar yang bersaing:
RFC 8259 - https://tools.ietf.org/html/rfc8259
ECMA-404 - http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
json.org menyarankan ECMA-404 adalah yang standar, tapi situs ini tidak muncul untuk menjadi otoritas. Meskipun saya pikir adil untuk menganggap ECMA otoritas, yang penting di sini adalah, satu-satunya perbedaan antara standar (mengenai kunci unik) adalah bahwa RFC 8259 mengatakan kunci harus unik, dan ECMA-404 mengatakan mereka tidak diharuskan untuk menjadi ECMA-404. unik.
RFC-8259:
Kata "harus" dalam semua huruf besar seperti itu, memiliki makna di dalam dunia RFC, yang secara spesifik didefinisikan dalam standar lain (BCP 14, RFC 2119 - https://tools.ietf.org/html/rfc2119 ) sebagai,
ECMA-404:
Jadi, tidak masalah bagaimana Anda mengirisnya, JSON itu secara sintaksis valid .
Alasan yang diberikan untuk rekomendasi kunci unik di RFC 8259 adalah,
Dengan kata lain, dari sudut pandang RFC 8259, itu valid tetapi parser Anda mungkin muntah dan tidak ada janji yang, jika ada, nilai akan dipasangkan dengan kunci itu. Dari sudut pandang ECMA-404 (yang saya pribadi anggap sebagai otoritas), sah saja, titik. Bagi saya ini berarti bahwa setiap parser yang menolak untuk menguraikannya rusak. Setidaknya harus diuraikan sesuai dengan kedua standar ini. Tetapi bagaimana hal itu berubah menjadi objek pilihan Anda, dalam hal apa pun, kunci unik atau tidak, sepenuhnya bergantung pada lingkungan dan situasi, dan tidak ada yang standar dalam memulainya.
sumber
Itu tidak didefinisikan dalam standar ECMA JSON . Dan secara umum, kurangnya definisi dalam standar berarti, "Jangan mengandalkan ini bekerja dengan cara yang sama di mana-mana."
Jika Anda seorang penjudi, "banyak" mesin JSON akan memungkinkan duplikasi dan cukup menggunakan nilai yang ditentukan terakhir. Ini:
Menjadi ini:
Tetapi jika Anda bukan penjudi, jangan mengandalkannya!
sumber
Standar mengatakan ini:
Bugnya setidaknya ada di node.js. Kode ini berhasil di node.js.
sumber
Menurut RFC-7159, standar saat ini untuk JSON yang diterbitkan oleh Internet Engineering Task Force (IETF), menyatakan "Nama-nama dalam suatu objek HARUS unik". Namun, menurut RFC-2119 yang mendefinisikan terminologi yang digunakan dalam dokumen-dokumen IETF, kata "harus" sebenarnya berarti "... mungkin ada alasan yang valid dalam keadaan tertentu untuk mengabaikan item tertentu, tetapi implikasi penuh harus dipahami dan hati-hati ditimbang sebelum memilih kursus yang berbeda. " Apa artinya ini pada dasarnya adalah bahwa walaupun memiliki kunci unik direkomendasikan, itu bukan keharusan. Kami dapat memiliki kunci duplikat di objek JSON, dan itu masih valid.
Dari aplikasi praktis, saya telah melihat nilai dari kunci terakhir dipertimbangkan ketika kunci duplikat ditemukan di JSON.
sumber
Dalam C # jika Anda deserialise ke
Dictionary<string, string>
itu dibutuhkan pasangan nilai kunci terakhir:jika Anda mencoba untuk deserialise
Anda mendapatkan
Newtonsoft.Json.JsonSerializationException
pengecualian.sumber