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.

Christophe
sumber
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.

Marcelo Cantos
sumber
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

Arun Rana
sumber
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
karns
sumber
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
7

Unicode codepoints U + D800 ke U + DFFF harus dihindari: mereka tidak valid di Unicode karena mereka dicadangkan untuk pasangan pengganti UTF-16. Beberapa encoders / decoder JSON akan menggantinya dengan U + FFFD. Lihat misalnya bagaimana bahasa Go dan perpustakaan JSON-nya berurusan dengan mereka .

Jadi hindari "\ uD800" menjadi "\ uDFFF" saja (bukan dalam pasangan pengganti).

dolmen
sumber