Apakah ada alasan praktis untuk menggunakan string yang dikutip untuk kunci JSON?

88

Menurut json.org Crockford , objek JSON terdiri dari anggota , yang terdiri dari pasangan .

Setiap pasangan terbuat dari string dan nilai , dengan string didefinisikan sebagai:

String adalah urutan dari nol atau lebih karakter Unicode, dibungkus dalam tanda kutip ganda, menggunakan pelolosan garis miring terbalik. Karakter direpresentasikan sebagai string karakter tunggal. String sangat mirip dengan string C atau Java.

Namun dalam praktiknya, sebagian besar programmer bahkan tidak tahu bahwa kunci JSON harus diapit oleh tanda kutip ganda, karena sebagian besar browser tidak memerlukan penggunaan tanda kutip ganda.

Apakah masuk akal untuk repot-repot mengelilingi JSON Anda dengan tanda kutip ganda?

Contoh yang Valid:

{
  "keyName" : 34
}

Berbeda dengan yang tidak valid:

{
   keyName : 34
}
Mark Rogers
sumber
20
"Mengapa repot-repot melakukannya dengan benar?" Ini adalah jenis pemikiran malas yang mengarah ke situs web yang sarat dengan markup tidak valid. Siapkan kode Anda di masa mendatang jika beberapa browser memang memerlukan tanda kutip ganda.
meagar
21
"Mengapa repot-repot melakukannya dengan benar?" - Mengapa repot-repot mengikuti konvensi yang tidak dilakukan orang lain, jika tidak ada manfaat yang nyata? Mungkin Anda mengacaukan pemikiran malas dengan pragmatisme.
Mark Rogers
15
@ Mark - "yang tidak dilakukan orang lain" ... dari mana Anda mendapatkan ide itu? serializer JSON yang terpasang di setiap platform utama melakukan kutipan yang tepat.
Nick Craver
7
@Mark Rogers PHP fungsi json_encode menghasilkan JSON yang valid, dengan string kutip ganda, misalnya. Mungkin Anda memikirkan literal objek di JavaScript? Benar bahwa itu berfungsi tanpa mengutip kunci, tetapi itu bukan JSON.
JAL
9
Sebagai catatan, bertahun-tahun yang lalu ketika saya memposting ini, saya bingung tentang perbedaan antara JSON dan notasi literal objek seperti yang disarankan @JAL. Keduanya memiliki sintaks yang sangat mirip, yang pada akhirnya menyebabkan kebingungan dalam menjelaskan masalah.
Mark Rogers

Jawaban:

157

Alasan sebenarnya tentang mengapa kunci JSON harus dalam tanda kutip, bergantung pada semantik Pengenal ECMAScript 3.

Kata yang dicadangkan tidak dapat digunakan sebagai nama properti di Object Literals tanpa tanda kutip, misalnya:

({function: 0}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

Sedangkan jika Anda menggunakan tanda kutip nama propertinya valid:

({"function": 0}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

Crockford sendiri menjelaskannya dalam pembicaraan ini , mereka ingin menjaga standar JSON tetap sederhana, dan mereka tidak ingin memiliki semua batasan semantik di atasnya:

....

Saat itulah kami menemukan masalah nama yang tidak dikutip. ECMA Script 3 ternyata memiliki kebijakan kata khusus yang mendera. Kata yang dicadangkan harus dikutip di posisi kunci, yang benar-benar mengganggu. Ketika saya sempat merumuskan ini menjadi standar, saya tidak ingin harus memasukkan semua kata yang dicadangkan ke dalam standar, karena itu akan terlihat sangat bodoh.

Pada saat itu, saya mencoba meyakinkan orang: ya, Anda dapat menulis aplikasi dalam JavaScript, ini benar-benar akan berfungsi dan itu adalah bahasa yang bagus. Saya tidak ingin mengatakan, lalu, pada saat yang sama: dan lihatlah hal bodoh yang mereka lakukan! Jadi saya memutuskan, mari kita kutip saja kuncinya.
Dengan begitu, kita tidak perlu memberi tahu siapa pun tentang betapa dahsyatnya itu.

Itulah mengapa, hingga hari ini, kunci dikutip dalam JSON.

...

ECMAScript 5th Edition Standard memperbaikinya, sekarang dalam implementasi ES5, bahkan kata-kata yang sudah dipesan dapat digunakan tanpa tanda kutip, baik di Object literal dan akses anggota ( obj.functionOk di ES5).

Sekadar catatan, standar ini diterapkan saat ini oleh vendor perangkat lunak, Anda dapat melihat browser apa yang menyertakan fitur ini pada tabel kompatibilitas ini (lihat Kata yang dipesan sebagai nama properti )

Christian C. Salvadó
sumber
1
@ Mark, sama-sama. Perlu diingat bahwa JSON hanyalah format pertukaran data tanpa bahasa , meskipun sintaksnya terinspirasi oleh sintaks Literal Objek Javascript, ada perbedaan di antara keduanya (lebih dari sekadar kunci yang dikutip).
Christian C. Salvadó
2
@CMS, Jadi mengapa harus hanya tanda kutip ganda? Mengapa tanda kutip tunggal tidak valid di JSON?
Pacerier
1
Tanda kutip tunggal tidak diizinkan untuk menjaga standar JSON sesederhana mungkin. JSON hanya perlu menjadi bagian dari Javascript, tidak perlu menerapkan Javascript sebanyak mungkin.
thomasrutter
The JSON5 superset spesifikasi menganut sintaks ES5 dan dengan demikian mendukung kunci kuotasi antara lain. Perpustakaan memiliki kompatibel parsedan stringifymetode.
Inigo
Dalam tautan tabel kompatibilitas itu (di bagian bawah jawaban) entri Kata-kata yang dipesan berada di bawah bagian ekstensi literal Objek / larik . Dan TL; DR, semua browser yang terdaftar (semua yang pernah Anda dengar dan sekitar 20 lainnya) semuanya berkata "Ya".
i336_
17

Ya, itu JSON tidak valid dan akan ditolak sebaliknya dalam banyak kasus, misalnya jQuery 1.4+ memiliki pemeriksaan yang membuat JSON yang tidak dikutip diam-diam gagal. Mengapa tidak patuh?

Mari kita ambil contoh lain:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... semua ini akan valid dengan tanda kutip, mengapa tidak konsisten dan menggunakannya dalam semua kasus, menghilangkan kemungkinan masalah?

Satu lagi contoh umum di dunia pengembang web: Ada ribuan contoh HTML tidak valid yang ditampilkan di sebagian besar browser ... apakah hal itu membuat proses debug atau pemeliharaan menjadi lebih mudah? Tidak sama sekali, justru sebaliknya.

Juga @ Matthew membuat poin terbaik dari semua dalam komentar di bawah, ini sudah gagal, kunci yang tidak dikutip akan memunculkan kesalahan sintaks JSON.parse()di semua browser utama (dan yang lain yang menerapkannya dengan benar), Anda dapat mengujinya di sini .

Nick Craver
sumber
Ya, saya memiliki beberapa aplikasi ajax lama yang menghasilkan sisi server schonky json, yang gagal saat ditingkatkan ke jquery 1.4 karena kurangnya tanda kutip ganda di sekitar nama kunci.
JAL
Anda mungkin ingin menambahkan bahwa semua browser utama JSON.parsejuga akan menolaknya dengan benar.
Matthew Flaschen
Saya penasaran, dalam kasus apa sebenarnya JQuery 1.4 akan gagal secara diam-diam dengan jenis json tidak valid ini?
Mark Rogers
1
@Mark - Bagaimanapun juga itu tidak dikutip dengan benar atau memiliki karakter yang tidak valid ... pada dasarnya itu akan gagal dengan JSON yang tidak valid.
Nick Craver
Itu menarik, itu belum pernah menjadi pengalaman saya dengan JQuery 1.4. Selain itu, menurut saya jquery tidak bertanggung jawab untuk membuat objek json, bukankah itu yang dilakukan oleh javascript interpreter browser? Apakah Anda mengacu pada deserialization Jquery json?
Mark Rogers
-4

YAML, yang sebenarnya adalah superset dari JSON, mendukung apa yang ingin Anda lakukan. Meskipun ini superset, ini memungkinkan Anda membuatnya sesederhana yang Anda inginkan.

YAML menghirup udara segar dan mungkin sepadan dengan waktu Anda untuk melihatnya. Tempat terbaik untuk memulai adalah di sini: http://en.wikipedia.org/wiki/YAML

Ada libs untuk setiap bahasa di bawah matahari, termasuk JS, misalnya https://github.com/nodeca/js-yaml

pengguna1649339
sumber
11
YAML bukanlah superset dari JSON.
John Gibb
untuk informasi tentang alasannya: stackoverflow.com/questions/25974485/…
Ben Page