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})
({if: 0})
({true: 0})
Chociaż jeśli używasz cudzysłowów, nazwy właściwości są prawidłowe:
({"function": 0})
({"if": 0})
({"true": 0})
Własny Crockford wyjaśnia to w tym wykładzie , chcieli, aby standard JSON był prosty i nie chcieli mieć wszystkich tych ograniczeń semantycznych:
....
Wtedy odkryliśmy problem z nazwami bez cytatów. Okazuje się, że ECMA Script 3 ma politykę dotyczącą słów zastrzeżonych. Zastrzeżone słowa należy cytować w pozycji kluczowej, co jest naprawdę uciążliwe. Kiedy doszedłem do sformułowania tego w standardzie, nie chciałem umieszczać wszystkich zastrzeżonych słów w standardzie, ponieważ wyglądałoby to naprawdę głupio.
W tamtym czasie starałem się przekonać ludzi: tak, możesz pisać aplikacje w JavaScript, to faktycznie zadziała i to jest dobry język. Nie chciałem więc jednocześnie powiedzieć: i spójrz na tę naprawdę głupią rzecz, którą zrobili! Postanowiłem więc zamiast tego zacytować klucze.
W ten sposób nie musimy nikomu mówić o tym, jak to jest.
Dlatego do dziś klucze są cytowane w formacie JSON.
...
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 )