Spesifikasi JSON mengatakan bahwa JSON adalah objek atau larik. Dalam kasus sebuah benda,
Struktur objek direpresentasikan sebagai sepasang tanda kurung kurawal yang mengelilingi nol atau lebih pasangan nama / nilai (atau anggota). Nama adalah string. ...
Dan kemudian, spesifikasi mengatakan bahwa string diapit tanda kutip.
Mengapa?
Jadi,
{"Property1":"Value1","Property2":18}
dan tidak
{Property1:"Value1",Property2:18}
Pertanyaan 1 : Mengapa tidak mengizinkan nama dalam pasangan nama / nilai menjadi pengenal tanpa tanda kutip?
Pertanyaan 2 : Apakah ada perbedaan semantik antara dua representasi di atas, saat dievaluasi dalam Javascript?
javascript
json
Cheeso
sumber
sumber
eval()
(mis. Javascript).Jawaban:
Filosofi desain JSON adalah "Tetap sederhana"
"Nama kutipan dengan
"
" jauh lebih sederhana daripada "Anda dapat mengutip nama dengan"
atau'
tetapi Anda tidak perlu, kecuali jika mengandung karakter tertentu (atau kombinasi karakter yang akan menjadikannya kata kunci) dan'
atau"
mungkin perlu dikutip tergantung pada pembatas apa yang Anda pilih " .Tidak. Dalam JavaScript, keduanya identik.
sumber
JSON.parse
function:JSON.parse('{"a":1}')
berfungsi dengan baik , mengapaJSON.parse('{a:1}')
akan memunculkan pengecualian .JSON.parse
adalah parser JSON yang diterapkan di JavaScript, ini bukan parser JavaScript.Saya meninggalkan kutipan dari presentasi yang diberikan Douglas Crockford (pencipta standar JSON) kepada Yahoo.
Dia berbicara tentang bagaimana dia menemukan JSON, dan di antara hal-hal lain mengapa dia memutuskan untuk menggunakan kunci yang dikutip :
Anda dapat menemukan video dan transkrip lengkapnya di sini .
sumber
{ a }
mana properti 'a' menyalin nilai variabel global atau lokal 'a'.{[key]: value}
Baik
:
dan spasi diizinkan dalam pengidentifikasi. Tanpa tanda kutip, ini akan menyebabkan ambiguitas saat mencoba menentukan apa sebenarnya yang dimaksud dengan pengenal.sumber
Dalam objek javascript dapat digunakan seperti hash / hashtable dengan pasangan kunci.
Namun, jika kunci Anda memiliki karakter yang tidak dapat dibuat token oleh javascript sebagai sebuah nama, kunci tersebut akan gagal saat mencoba mengaksesnya seperti properti pada objek, bukan kunci.
var test = {}; test["key"] = 1; test["#my-div"] = "<div> stuff </div>"; // test = { "key": 1, "#my-div": "<div> stuff </div>" }; console.log(test.key); // should be 1 console.log(test["key"]); // should be 1 console.log(test["#my-div"]); // should be "<div> stuff </div>"; console.log(test.#my-div); // would not work.
pengenal terkadang dapat memiliki karakter yang tidak dapat dievaluasi sebagai token / pengenal dalam javascript, oleh karena itu yang terbaik adalah meletakkan semua pengenal dalam string agar konsisten.
sumber
Saya pikir jawaban yang tepat untuk pertanyaan Cheeso adalah bahwa implementasinya melampaui dokumentasi. Ini tidak lagi membutuhkan string sebagai kuncinya, melainkan sesuatu yang lain, yang bisa berupa string (yaitu dikutip) atau (mungkin) apa pun yang dapat digunakan sebagai nama variabel, yang menurut saya berarti dimulai dengan huruf, _ , atau $, dan hanya menyertakan huruf, angka, dan $ dan _.
Saya ingin menyederhanakan sisanya untuk orang berikutnya yang mengunjungi pertanyaan ini dengan ide yang sama dengan yang saya lakukan. Ini dagingnya:
Nama variabel tidak diinterpolasi di JSON saat digunakan sebagai kunci objek (Terima kasih Friedo!)
Breton, menggunakan "pengenal" bukan "kunci", menulis bahwa "jika pengenal kebetulan adalah kata yang dipesan, itu diartikan sebagai kata itu daripada sebagai pengenal." Ini mungkin benar, tetapi saya mencobanya tanpa masalah:
var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7}; a.break
=> 6
Tentang penggunaan tanda kutip, Quentin menulis "... tetapi Anda tidak perlu melakukannya, kecuali [kunci] berisi karakter tertentu (atau kombinasi karakter yang akan menjadikannya kata kunci)"
Saya menemukan bagian sebelumnya (karakter tertentu) benar, menggunakan tanda @ (sebenarnya, saya pikir $ dan _ adalah satu-satunya karakter yang tidak menyebabkan kesalahan):
var a = {a@b:1};
=> Kesalahan sintaks
var a = {"a@b":1}; a['a@b']
=> 1
tetapi tanda kurung tentang kata kunci, seperti yang saya tunjukkan di atas, tidak benar.
Apa yang saya inginkan berfungsi karena teks antara pembukaan {dan titik dua, atau antara koma dan titik dua untuk properti berikutnya digunakan sebagai string tanpa tanda kutip untuk membuat kunci objek, atau, seperti yang dikatakan Friedo, nama variabel di sana tidak ' t mendapatkan interpolasi:
var uid = getUID(); var token = getToken(); // Returns ABC123 var data = {uid:uid,token:token}; data.token
=> ABC123
sumber
Jika json mendeskripsikan objek, maka dalam praktiknya Anda mendapatkan yang berikut
var foo = {}; var bar = 1; foo["bar"] = "hello"; foo[bar] = "goodbye";
sehingga kemudian,
foo.bar == "hello"; foo[1] == "goodbye" // in setting it used the value of var bar
jadi meskipun contoh Anda menghasilkan hasil yang sama, padanannya dalam "kode mentah" tidak akan. Mungkin itu sebabnya ?? tak tahu, hanya ide.
sumber
{ bar: 'goodbye' }
tidak akan menyetel nama kunci menjadi nilaibar
, itu hanya akanbar
. Yang lain benar tentang alasan mengapa spesifikasi membutuhkan tanda kutip: itu untuk menghindari konflik kata kunci dan karakter khusus.Ini dapat mengurangi ukuran data jika kutipan pada nama hanya diperbolehkan jika diperlukan
sumber