Apakah kunci JSON harus dikelilingi oleh tanda kutip?

236

Contoh: Apakah kode berikut ini valid terhadap JSON Spec ?

{
    precision: "zip"
}

Atau haruskah saya selalu menggunakan sintaks berikut? (Dan jika demikian, mengapa?)

{
    "precision": "zip"
}

Saya belum benar-benar menemukan sesuatu tentang ini dalam spesifikasi JSON. Meskipun mereka menggunakan tanda kutip di sekitar kunci mereka dalam contoh mereka.

usaha pembaptisan
sumber

Jawaban:

147

Ya, Anda membutuhkan tanda kutip. Ini untuk membuatnya lebih sederhana dan untuk menghindari keharusan memiliki metode pelarian lain untuk kata kunci yang dilindungi javascript, yaitu {for:"foo"}.

cobbal
sumber
12
Kutipan tidak sederhana dalam banyak situasi, seperti file konfigurasi yang diedit dengan tangan. Hal yang disayangkan tentang JSON yang digunakan (dan disalahgunakan) sebagai format interchange yang hampir universal adalah bahwa ia memiliki fitur khusus untuk Javascript.
miguel
12
Alasan sebenarnya - periksa jawaban ini juga - stackoverflow.com/questions/4201441/…
TechMaze
3
Tl; dr: mereka tidak ingin berurusan dengan pembatasan ECMAScript pada kata kunci (tidak dikutip) yang dicadangkan sebagai kunci, sehingga mereka hanya perlu mengutip semua kunci.
BallpointBen
136

Anda benar menggunakan string sebagai kuncinya. Berikut adalah kutipan dari RFC 4627 - Aplikasi / json Jenis Media untuk Notasi Objek JavaScript (JSON)

2.2. Benda

Struktur objek direpresentasikan sebagai sepasang kurung keriting yang mengelilingi nol atau lebih pasangan nama / nilai (atau anggota). Sebuah nama adalah sebuah string . Satu titik dua muncul setelah setiap nama, memisahkan nama dari nilai. Satu koma memisahkan nilai dari nama berikut. Nama-nama dalam suatu objek HARUS unik.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2.5. String

Representasi string mirip dengan konvensi yang digunakan dalam keluarga bahasa pemrograman C. Sebuah string dimulai dan diakhiri dengan tanda kutip. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Baca seluruh RFC di sini .

PatrikAkerstrand
sumber
11
Dan untuk menyelesaikan pikiran itu, bagian 2.5 mengatakan: A string begins and ends with quotation marks..
rakslice
13

Dari 2.2. Benda

Struktur objek direpresentasikan sebagai sepasang kurung keriting yang mengelilingi nol atau lebih pasangan nama / nilai (atau anggota). Nama adalah sebuah string.

dan mulai 2.5. String

Sebuah string dimulai dan diakhiri dengan tanda kutip.

Jadi saya akan mengatakan bahwa sesuai dengan standar: ya, Anda harus selalu mengutip kunci (meskipun beberapa parser mungkin lebih pemaaf)

Cebjyre
sumber
7

Ya, kutipan wajib. http://json.org/ mengatakan:

string
    ""
    " chars "

sumber
0

Ya mereka melakukanya. Tetapi jika Anda membutuhkan yang lain, checkout JSON5 .

JSON5 adalah superset dari JSON yang memungkinkan sintaks ES5, termasuk:

  • kunci properti yang tidak dikutip
  • single-dikutip, lolos dan string multi-line
  • format angka alternatif
  • komentar
  • spasi ekstra

Implementasi referensi JSON5 ( json5paket npm ) menyediakan JSON5objek yang memiliki parsedan stringifymetode dengan argumen dan semantik yang sama dengan JSONobjek bawaan .

Inigo
sumber
-2

Karena Anda dapat meletakkan notasi bertitik "parent.child" dan Anda tidak harus meletakkan parent ["child"] yang juga valid dan berguna, saya akan mengatakan kedua cara tersebut secara teknis dapat diterima. Pengurai semua harus melakukan keduanya dengan baik. Jika parser Anda tidak memerlukan tanda kutip pada kunci, maka mungkin lebih baik untuk tidak menempatkannya (menghemat ruang). Masuk akal untuk memanggil mereka string karena itulah mereka, dan karena tanda kurung memberi Anda kemampuan untuk menggunakan nilai untuk kunci pada dasarnya masuk akal untuk tidak melakukannya. Di Json Anda dapat menempatkan ...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

baik-baik saja tanpa masalah, jika Anda membutuhkan nilai untuk kunci dan tidak ada yang dikutip tidak akan berhasil, jadi jika tidak, Anda tidak bisa, jadi Anda tidak akan jadi "Anda tidak perlu tanda kutip pada kunci". Bahkan jika itu benar untuk mengatakan mereka secara teknis string. Logika dan penggunaan berpendapat sebaliknya. Juga tidak secara resmi menampilkan Object {"someKey": "someValue"} untuk obj dalam contoh kita dijalankan dari konsol browser apa pun.

Tuan James
sumber
2
Baik jawaban yang diterima maupun RFC yang mendefinisikan JSON mengatakan bahwa kuotasi diperlukan.
Keith Thompson
Itu benar, tetapi patut dicatat secara logis tidak perlu. Saya kira output Notasi Objek JavaScript dari semua konsol browser salah, dan kita harus memberi tahu seseorang untuk memperbaikinya. Mungkin apa yang dihasilkan konsol Peramban untuk objek bukanlah JSON, jadi mungkin JSON sebagai spesifikasi tidak diperlukan atau diterapkan seperti itu di sebagian besar tempat. Pokoknya saya hanya ingin membuat kasus, yang melihat fakta dengan cara yang berbeda. Benar-benar mungkin spek harus diubah kemudian, "Kunci Dikutip" sama sekali tidak diperlukan di tempat yang penting bagi saya secara pribadi. (Hanya saja tidak digunakan seperti itu dalam praktik.)
Master James
2
Anda mencampur tiga hal berbeda: JSON, literal objek JavaScript, dan output konsol alat pengembang browser. Saat Anda mengetik objdi konsol, browser menampilkan beberapa representasi objek yang dapat dibaca manusia. Mungkin menampilkannya sebagai objek literal (seperti yang terjadi pada contoh Anda), atau mungkin menggunakan beberapa representasi lain, bahkan yang interaktif. Literal objek JavaScript tidak memerlukan tanda kutip di sekitar nama kunci jika kunci tersebut merupakan pengidentifikasi yang valid dan bukan kata yang dipesan. Namun, JSON selalu membutuhkan tanda kutip di sekitar nama-nama kunci.
Michael Geary
3
Sebagai contoh lebih lanjut, alih-alih mengetik objdi konsol, coba JSON.stringify(obj). Sekarang Anda akan melihat representasi JSON yang valid dari objek, lengkap dengan nama kunci yang dikutip. Sebaliknya, untuk melihat apakah suatu string adalah JSON yang valid, coba JSON.parse(string). Jika kunci tidak dikutip, ini akan menimbulkan pengecualian. Misalnya JSON.parse('{"a":"b"}')akan berhasil, tetapi JSON.parse('{a:"b"}')akan gagal.
Michael Geary
1
OTOH, penggunaan Anda var obj = {[keyName]:"someValue"};sangat menarik! Saya tidak tahu Anda bisa melakukannya dalam objek JavaScript secara literal. Sedikit pemeriksaan menunjukkan bahwa ini adalah sesuatu yang baru di ES6 - Anda tidak dapat melakukannya di ES5.
Michael Geary