Przykład: czy następujący kod jest poprawny w stosunku do zgodny ze specyfikacją JSON ?
{
precision: "zip"
}
Czy powinienem zawsze używać następującej składni? (A jeśli tak, to dlaczego?)
{
"precision": "zip"
}
Tak naprawdę nie znalazłem czegoś na ten temat w specyfikacjach JSON. Chociaż w swoich przykładach używają cudzysłowów wokół swoich kluczy.
json
specifications
standards-compliance
json5
christianvuerings
źródło
źródło
Poprawne jest używanie ciągów jako klucza. Oto fragment RFC 4627 - Aplikacja / json Media Type dla JavaScript Object Notation (JSON)
Przeczytaj cały RFC tutaj .
źródło
A string begins and ends with quotation marks.
.Od 2.2. Obiekty
i od 2.5. Smyczki
Powiedziałbym więc, że zgodnie ze standardem: tak, zawsze powinieneś cytować klucz (chociaż niektóre parsery mogą być bardziej wybaczające)
źródło
Tak, cytaty są obowiązkowe. http://json.org/ mówi:
źródło
Tak, robią. Ale jeśli potrzebujesz inaczej, sprawdź JSON5 .
JSON5 to nadzbiór JSON, który umożliwia składnię ES5, w tym:
Implementacja referencyjna JSON5 (
json5
pakiet npm ) zapewniaJSON5
obiekt, który maparse
istringify
metody z tymi samymi argumentami i semantyką jak obiekt wbudowanyJSON
.źródło
Ponieważ możesz umieścić kropkowaną notację „parent.child” i nie musisz umieszczać nadrzędnej [„child”], która jest również ważna i przydatna, powiedziałbym, że obie metody są technicznie dopuszczalne. Wszystkie parsery powinny działać w obie strony w porządku. Jeśli twój parser nie potrzebuje cudzysłowów na klawiszach, prawdopodobnie lepiej nie wstawiać ich (oszczędza miejsce). Sensowne jest nazywanie ich ciągami, ponieważ takie są, a ponieważ nawiasy kwadratowe dają możliwość używania wartości dla kluczy, w zasadzie nie ma sensu. W Json możesz umieścić ...
w porządku bez problemów, jeśli potrzebujesz wartości dla klucza i żaden cytowany nie będzie działał, więc jeśli nie, nie możesz, więc nie będziesz tak „nie potrzebował cudzysłowów na kluczach”. Nawet jeśli słusznie jest powiedzieć, że są technicznie sznurkami. Logika i użycie argumentują inaczej. Oficjalnie nie wypisuje też obiektu {"someKey": "someValue"} dla obj w naszym przykładzie z konsoli dowolnej przeglądarki.
źródło
obj
w konsoli przeglądarka wyświetla czytelną dla człowieka reprezentację obiektu. Może wyświetlać go jako dosłowny obiekt (tak jak w twoim przykładzie) lub może użyć innej reprezentacji, nawet interaktywnej. Literały obiektów JavaScript nie wymagają cudzysłowów wokół nazwy klucza, jeśli klucz jest prawidłowym identyfikatorem, a nie słowem zastrzeżonym. Jednak JSON zawsze wymaga cudzysłowów wokół nazw kluczy.obj
w konsoli, spróbujJSON.stringify(obj)
. Teraz zobaczysz prawidłową reprezentację JSON obiektu wraz z cytowaną nazwą klucza. I odwrotnie, aby sprawdzić, czy łańcuch jest prawidłowy JSON, spróbujJSON.parse(string)
. Jeśli klucze nie zostaną podane, spowoduje to wyjątek. Na przykładJSON.parse('{"a":"b"}')
odniesie sukces, aleJSON.parse('{a:"b"}')
zakończy się niepowodzeniem.var obj = {[keyName]:"someValue"};
jest bardzo interesujące! Nie wiedziałem, że możesz to zrobić w dosłownym obiekcie JavaScript. Trochę sprawdzania pokazuje, że jest to coś nowego w ES6 - nie można tego zrobić w ES5.