Które znaki są prawidłowe / nieprawidłowe w nazwie klucza JSON?

151

Czy w nazwach kluczy są jakieś niedozwolone znaki dla obiektów JavaScript lub ciągów JSON? Albo postacie, którym trzeba uciec?

Mówiąc dokładniej, chciałbym użyć „$”, „-” i spacji w nazwach kluczy.

Christophe
źródło
Myślę, że częściowo ta odpowiedź ma związek ze sposobem kodowania. Na przykład UTF8 ma inne dozwolone znaki niż ANSI.
invalidsyntax
4
Możesz użyć dowolnego „klucza” w JS, używając obj['whatever']notacji. Ale dla obj.whateverwersji można używać tylko zwykłych klawiszy alfanumerycznych .
Marc B
4
@invalidsyntax: JSON jest z definicji Unicode. Ponadto ANSI nie jest kodowaniem, to zestaw znaków, więc porównanie powinno być Unicode-vs-ANSI, a nie UTF-8-vs-ANSI.
Marcelo Cantos
1
Stara dyskusja, ale ASCII (do czego ludzie często odwołują się przez ANSI) jest kodowaniem, a ponadto definiuje również zestaw znaków.
Trinidad

Odpowiedzi:

167

Nie. Każdy poprawny ciąg jest prawidłowym kluczem. Może nawet mieć "tak długo, jak uciekniesz:

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

Być może jest szansa, że ​​napotkasz trudności z ładowaniem takich wartości do niektórych języków, które próbują skojarzyć klucze z nazwami pól obiektów. Nie znam jednak takich przypadków.

Marcelo Cantos
źródło
Dzięki! Jakieś inne postacie, którym trzeba było uciec? Jak: lub; ?
Christophe,
11
Nie te. Cokolwiek wymaga ucieczki w JavaScript, zazwyczaj potrzebuje tego w JSON. Najlepiej jednak wyciągnąć go z pyska konia na json.org. Przeczytanie całej specyfikacji zajmuje około minuty.
Marcelo Cantos
3
To nie jest dobra odpowiedź, imho. Z jakich postaci należy uciec? Którym postaciom można uciec, ale nie trzeba tego robić?
Daniel W.
Czy ktoś może wyjaśnić, czy obejmuje to takie rzeczy, jak znak null Unicode (U + 0000, zwykły „bajt null” w UTF-8) itp.? Zarówno json.org, jak i powiązany oficjalny / formalny plik PDF specyfikacji ECMA wydają się sugerować, że tak, są one prawidłowe w formacie JSON, nawet w ich dosłownej formie (nie tylko w \u four-hex-digitsformie).
mtraceur
1
@OutofOrbit Czy możesz po prostu załadować go do nietypowego obiektu?
Marcelo Cantos
54

Następujące znaki muszą zostać zmienione w danych JSON, aby uniknąć problemów

pojedynczy cudzysłów

”Cytat

\ ukośnik wsteczny

wszystkie znaki sterujące, takie jak \ n \ t

JSON Parser może pomóc w radzeniu sobie z JSON.

EDYCJA: Oto zastępczy parser JSON, ponieważ łącze OP jest martwe

Arun Rana
źródło
5
Cześć Arun, pojedyncze cudzysłowy nie muszą być unikane. W rzeczywistości ich uniknięcie spowoduje, że ścisłe parsery JSON zgłoszą wyjątek. Zapoznaj się z sekcją dotyczącą ciągów znaków w witrynie json.org. Oczywiście jednak będziesz musiał przed nimi uciec, gdy znajdują się wewnątrz ciągu JSON (ale nie samego JSON).
Alex KeySmith
5
@AlexKey masz całkowitą rację! Arun, możesz to sprawdzić na jsonlint.com , testując { "singlequotetest": "something here isn\'t right"}porównanie JSON{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be
@Arun Rana - bez obaw.
Alex KeySmith
3
{"* ~ @ # $% ^ & * () _ + => <? /": "to prawidłowy plik json"}
Abhi,
45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos
12

Warto wspomnieć, że uruchomienie kluczy numerami może spowodować niezamierzone problemy.

Przykład:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround
karns
źródło
6
Naprawdę mam nadzieję, że w tym wieku Microsoft 2017/18 żałują całego bólu, który zadali.
monsto
1
Spójrz na ich parametry identyfikatora metryki: dev.applicationinsights.io/apiexplorer/ ... --- 15 lub 20 ich pól ma wiele ukośników w nazwach pól json. Chociaż rozwiązanie Karns działa dla określonego pola, nie wydaje mi się, aby działało dla podpola 1tile. Np. Kolejna kropka zwraca dla mnie nieokreśloną wartość.
Jon Luzader
Dlaczego wspomniano tam o IE? Identyfikatory zaczynające się od liczb są niedozwolone w każdej implementacji ECMAScript.
m93a
@ m93a IE nie jest akronimem dla Internet Explorera ... zły dobór słów: /
karns
To powinna być najlepsza odpowiedź
Joe Elia
7

Należy unikać punktów kodowych Unicode U + D800 do U + DFFF: są one nieprawidłowe w Unicode, ponieważ są zarezerwowane dla zastępczych par UTF-16. Niektóre kodery / dekodery JSON zastąpią je U + FFFD. Zobacz na przykład, jak radzi sobie z nimi język Go i jego biblioteka JSON .

Dlatego unikaj samych „\ uD800” do „\ uDFFF” (nie w parach zastępczych).

dolmen
źródło