Karakter mana yang valid / tidak valid dalam nama kunci JSON?


151

Apakah ada karakter terlarang dalam nama kunci, untuk objek JavaScript atau string JSON? Atau karakter yang perlu diloloskan?

Untuk lebih spesifik, saya ingin menggunakan "$", "-" dan spasi dalam nama-nama utama.


Saya kira sebagian jawaban ini ada hubungannya dengan cara Anda menyandikan. Misalnya, UTF8 memiliki karakter berbeda yang dibolehkan versus ANSI.
invalidsyntax

4
Anda dapat menggunakan 'kunci' apa pun yang Anda inginkan di JS menggunakan obj['whatever']notasi. Tetapi hanya kunci alfanumerik biasa yang dapat digunakan untuk obj.whateverversi ini.
Marc B

4
@invalidsyntax: JSON adalah Unicode menurut definisi. Selain itu, ANSI bukan pengodean, ini adalah rangkaian karakter, jadi perbandingannya harus Unicode-vs-ANSI, bukan UTF-8-vs-ANSI.
Marcelo Cantos

1
Tapi diskusi lama, ASCII (apa yang orang sering sebut dengan ANSI) adalah pengkodean dan di atas itu juga mendefinisikan seperangkat karakter.
Trinidad

Jawaban:


167

Tidak. String apa pun yang valid adalah kunci yang valid. Ia bahkan dapat memiliki "selama Anda menghindarinya:

{"The \"meaning\" of life":42}

Mungkin ada kemungkinan Anda akan menemui kesulitan memuat nilai-nilai tersebut ke beberapa bahasa, yang mencoba mengaitkan kunci dengan nama bidang objek. Saya tidak tahu ada kasus seperti itu.


Terima kasih! Adakah karakter lain yang perlu diloloskan? Seperti: atau; ?
Christophe

11
Bukan itu. Kebutuhan apa pun yang lolos dalam JavaScript biasanya membutuhkannya di JSON. Cara terbaik untuk mendapatkannya dari mulut kuda, di json.org. Dibutuhkan sekitar satu menit untuk membaca keseluruhan spesifikasi ujung ke ujung.
Marcelo Cantos

3
Ini bukan jawaban yang bagus. Karakter seperti apa yang perlu diloloskan? Karakter mana yang bisa lolos, tetapi tidak harus melarikan diri?
Daniel W.

Adakah yang bisa mengklarifikasi jika ini termasuk hal-hal seperti karakter null Unicode (U + 0000, "byte nol" polos di UTF-8), dll? Baik json.org dan spesifikasi ECMA resmi / formal yang tertaut tampaknya menyiratkan bahwa ya, itu valid di JSON, bahkan dalam bentuk literalnya (tidak hanya dalam \u four-hex-digitsbentuk).
mtraceur

1
@OutofOrbit Bisakah Anda memuatnya ke dalam Objek yang tidak diketik?
Marcelo Cantos

54

Karakter berikut harus melarikan diri dalam data JSON untuk menghindari masalah

'Kutipan tunggal

”Kutipan

\ backslash

semua karakter kontrol suka \ n \ t

Parser JSON dapat membantu Anda untuk berurusan dengan JSON.

EDIT: Ini adalah parser JSON pengganti karena tautan OP sudah mati


5
Hai Arun, tanda kutip tunggal tidak perlu diloloskan. Infact lolos dari mereka akan menyebabkan parser JSON yang ketat untuk melemparkan pengecualian. Rujuk ke bagian string dari json.org Tentu saja Anda harus melarikan diri ketika berada di dalam string JSON (tetapi bukan JSON itu sendiri).
Alex KeySmith

5
@AlexKey Anda sepenuhnya benar! Arun, Anda dapat memeriksa ini di jsonlint.com dengan menguji JSON { "singlequotetest": "something here isn\'t right"}versus{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@Arun Rana - jangan khawatir.
Alex KeySmith

3
{"* ~ @ # $% ^ & * () _ + => <? /": "adalah json yang valid"}
Abhi

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos

12

Perlu disebutkan bahwa saat memulai kunci dengan angka valid, itu dapat menyebabkan beberapa masalah yang tidak diinginkan.

Contoh:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

6
Saya sangat berharap bahwa, di usia Microsoft 2017/18 ini, mereka menyesali semua rasa sakit yang mereka timbulkan.
monsto

1
Lihatlah parameter ID metrik mereka: dev.applicationinsights.io/apiexplorer/... --- 15 atau 20 bidang mereka memiliki beberapa garis miring ke depan dalam nama bidang json mereka. Sementara solusi Karns bekerja untuk bidang tertentu, saya sepertinya tidak bisa membuatnya bekerja untuk sub-bidang 1tile. Misalnya, titik berikutnya mengembalikan yang tidak ditentukan untuk saya.
Jon Luzader

Mengapa IE disebutkan di sana? Identifier yang dimulai dengan angka adalah ilegal di setiap implementasi ECMAScript.
m93a

@ m93a IE tidak dimaksudkan sebagai akronim untuk Internet Explorer ... pilihan kata yang buruk: /
karns

Ini harus menjadi jawaban terbaik
Joe Elia

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.