Według witryny json.org Crockforda obiekt JSON składa się z elementów członkowskich , które składają się z par .
Każda para składa się z ciągu i wartości , przy czym łańcuch jest zdefiniowany jako:
Łańcuch to sekwencja zera lub więcej znaków Unicode, umieszczona w podwójnych cudzysłowach, przy użyciu odwrotnych ukośników. Znak jest reprezentowany jako pojedynczy ciąg znaków. Ciąg jest bardzo podobny do ciągu w języku C lub Java.
Jednak w praktyce większość programistów nawet nie wie, że klucz JSON powinien być otoczony podwójnymi cudzysłowami, ponieważ większość przeglądarek nie wymaga używania cudzysłowów.
Czy warto zawracać sobie głowę otaczaniem JSON w podwójnych cudzysłowach?
Prawidłowy przykład:
{
"keyName" : 34
}
W przeciwieństwie do inwalidów:
{
keyName : 34
}
javascript
json
browser
double-quotes
Mark Rogers
źródło
źródło
Odpowiedzi:
Prawdziwy powód, dla którego klucze JSON powinny być w cudzysłowach, wynika z semantyki identyfikatorów ECMAScript 3.
Zarezerwowanych słów nie można używać jako nazw właściwości w literałach obiektów bez cudzysłowów, na przykład:
({function: 0}) // SyntaxError ({if: 0}) // SyntaxError ({true: 0}) // SyntaxError // etc...
Chociaż jeśli używasz cudzysłowów, nazwy właściwości są prawidłowe:
({"function": 0}) // Ok ({"if": 0}) // Ok ({"true": 0}) // Ok
Własny Crockford wyjaśnia to w tym wykładzie , chcieli, aby standard JSON był prosty i nie chcieli mieć wszystkich tych ograniczeń semantycznych:
Standard ECMAScript 5th Edition rozwiązuje ten problem, teraz w implementacji ES5 nawet zastrzeżone słowa mogą być używane bez cudzysłowów, zarówno w literałach obiektu, jak i dostępie do elementów członkowskich (
obj.function
Ok w ES5).Tak dla przypomnienia, ten standard jest obecnie wdrażany przez dostawców oprogramowania, możesz zobaczyć, które przeglądarki zawierają tę funkcję w tej tabeli zgodności (zobacz słowa zastrzeżone jako nazwy właściwości )
źródło
parse
istringify
metody.Tak, jest to nieprawidłowy JSON i w wielu przypadkach zostanie odrzucony, na przykład jQuery 1.4+ ma kontrolę, która powoduje dyskretne niepowodzenie niezacytowanego JSON. Dlaczego nie zachować zgodności?
Weźmy inny przykład:
{ myKey: "value" } { my-Key: "value" } { my-Key[]: "value" }
... wszystko to byłoby poprawne w przypadku cudzysłowów, dlaczego by nie być spójnym i używać ich we wszystkich przypadkach, eliminując możliwość wystąpienia problemu?
Jeszcze jeden typowy przykład ze świata twórców stron internetowych: istnieją tysiące przykładów nieprawidłowego kodu HTML, który renderuje się w większości przeglądarek ... czy to sprawia, że debugowanie lub konserwacja jest mniej bolesna? Wcale nie, wręcz przeciwnie.
Również @ Matthew zwraca uwagę na to, co najlepsze w komentarzach poniżej, to już się nie udaje, niecytowane klawisze będą powodować błąd składni
JSON.parse()
we wszystkich głównych przeglądarkach (i wszystkich innych, które implementują go poprawnie), możesz to przetestować tutaj .źródło
JSON.parse
również poprawnie ją odrzucą.YAML, który w rzeczywistości jest nadzbiorem JSON, obsługuje to, co chcesz zrobić. Chociaż jest to nadzbiór, pozwala Ci zachować tak prostą, jak chcesz.
YAML to powiew świeżego powietrza i warto poświęcić czas, aby mu się przyjrzeć. Najlepszym miejscem do rozpoczęcia jest tutaj: http://en.wikipedia.org/wiki/YAML
Istnieją biblioteki dla każdego języka pod słońcem, w tym JS, np. Https://github.com/nodeca/js-yaml
źródło