JSON anahtar adında hangi karakterler geçerli / geçersiz?


151

Anahtar adlarında, JavaScript nesneleri veya JSON dizeleri için yasak karakterler var mı? Veya kaçması gereken karakterler?

Daha açık olmak gerekirse, "$", "-" ve anahtar adlarında boşluk kullanmak istiyorum.


Bu cevabın kısmen kodlama şeklinizle ilgili olduğunu düşünüyorum. Örneğin, UTF8'in ANSI'ye karşı izin verilen farklı karakterleri vardır.
invalidsyntax

4
obj['whatever']Notasyonu kullanarak JS'de istediğiniz herhangi bir 'anahtarı' kullanabilirsiniz . Ancak obj.whateversürüm için yalnızca normal alfasayısal tuşlar kullanılabilir .
Marc B

4
@invalidsyntax: JSON tanımı gereği Unicode'dur. Ayrıca, ANSI bir kodlama değildir, bir karakter kümesidir, bu nedenle karşılaştırma Unicode-vs-ANSI, UTF-8-vs-ANSI olmalıdır.
Marcelo Cantos

1
Eski tartışma ancak ASCII (insanların ANSI tarafından sık sık bahsettikleri) bir kodlamadır ve bunun üzerine bir karakter seti de tanımlar.
Trinidad

Yanıtlar:


167

Hayır. Geçerli herhangi bir dize geçerli bir anahtardır. Kaçtığınız sürece bile olabilir ":

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

Belki de anahtarları nesne alanı adları ile ilişkilendirmeye çalışan bu tür değerleri bazı dillere yüklerken zorluklarla karşılaşma şansınız vardır. Ancak böyle bir durum bilmiyorum.


Teşekkürler! Kaçması gereken başka karakterler var mı? Gibi: veya; ?
Christophe

11
O değil. JavaScript'ten kaçmak için gereken her şey genellikle JSON'da gerekir. Yine de, at ağzından almak için json.org'da. Spesifikasyonların tamamını uçtan uca okumak yaklaşık bir dakika sürer.
Marcelo Cantos

3
Bu iyi bir cevap değil imho. Ne tür karakterler kaçmalı? Hangi karakterler kaçabilir, ancak kaçmak zorunda değilsiniz?
Daniel W.

Bunun Unicode null karakteri (U + 0000, UTF-8'deki düz "null bayt") gibi şeyleri içerip içermediğini herkes anlayabilir mi? Hem json.org hem de bağlantılı resmi / resmi ECMA şartname PDF'si evet, bunların JSON'da , gerçek formlarında (sadece \u four-hex-digitsformda değil) bile geçerli olduğunu ima ediyor gibi görünüyor .
mtraceur

1
@OutofOrbit Sadece türetilmemiş bir nesneye yükleyebilir misiniz?
Marcelo Cantos

54

Herhangi bir problemden kaçınmak için JSON verilerinde aşağıdaki karakterler kullanılmalıdır

' tek alıntı

" alıntı

\ ters eğik çizgi

\ n \ t gibi tüm kontrol karakterleri

JSON Ayrıştırıcı , ile başa çıkmanıza yardımcı olabilir.

DÜZENLEME: İşte OP'nin bağlantısı öldüğü için yedek bir JSON ayrıştırıcısı


5
Merhaba Arun, tek tırnak kaçış gerekmez. Onlardan kaçan kesin katı JSON ayrıştırıcılarının bir istisna oluşturmasına neden olur. Json.org dizesi bölümüne bakın Tabii ki bir JSON dizesinin içindeyken bunlardan kaçmanız gerekir (ancak JSON'un kendisi değil).
Alex KeySmith

5
@AlexKey tamamen haklısın! Arun, bunu JSON'a{ "singlequotetest": "something here isn\'t right"} karşı test ederek jsonlint.com'da kontrol edebilirsiniz{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@Arun Rana - endişelenme.
Alex KeySmith

3
{"* ~ @ # $% ^ & * () _ + => <? /": "geçerli bir json" "
Abhi

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

12

Anahtarları sayılarla başlatırken geçerli iken, bazı istenmeyen sorunlara neden olabileceğini belirtmek gerekir.

Misal:

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

6
Umarım, Microsoft'un bu 2017/18 yaşında, verdikleri tüm acıdan pişman olurlar.
monsto

1
Metrik kimlik parametrelerine bakın: dev.applicationinsights.io/apiexplorer/… --- Alanlarının 15 veya 20'sinin json alan adlarında birden fazla eğik çizgi vardır. Karns çözümü belirli bir alanda çalışsa da, 1tile alt alanında çalışmayı başaramıyorum. Örneğin, bir sonraki nokta benim için tanımsız olarak döner.
Jon Luzader

IE neden burada belirtiliyor? Sayısal ile başlayan tanımlayıcılar her ECMAScript uygulamasında yasa dışıdır.
m93a

@ m93a IE Internet Explorer için bir kısaltma anlamına gelmez ... kötü kelime seçimi: /
karns

Bu en iyi cevap olmalı
Joe Elia

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.