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.


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.


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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.