Uważnie przeczytałem opis JSON http://json.org/, ale nie jestem pewien, czy znam odpowiedź na proste pytanie. Jakie ciągi są najmniejszym możliwym prawidłowym kodem JSON?
"string"
czy ciąg to prawidłowy format JSON?42
czy prosta liczba jest poprawna w formacie JSON?true
czy wartość logiczna to prawidłowy format JSON?{}
czy pusty obiekt jest prawidłowym plikiem JSON?[]
czy pusta tablica to prawidłowy format JSON?
javascript
json
validation
bessarabov
źródło
źródło
Odpowiedzi:
W chwili pisania tego tekstu JSON był opisany wyłącznie w RFC4627 . Opisuje (na początku „2”) tekst JSON jako zserializowany obiekt lub tablicę.
Oznacza to, że tylko
{}
i[]
są prawidłowe, pełne ciągi JSON w parserach i ciągnikach zgodnych z tym standardem.Jednak wprowadzenie ECMA-404 to zmienia, a zaktualizowane porady można przeczytać tutaj . Napisałem również wpis na blogu w tej sprawie.
Aby jeszcze bardziej zmylić sprawę,
JSON
obiekt (np.JSON.parse()
IJSON.stringify()
) dostępny w przeglądarkach internetowych jest ustandaryzowany w ES5 i jasno definiuje dopuszczalne teksty JSON, takie jak:Oznaczałoby to, że wszystkie wartości JSON (w tym ciągi, wartości null i liczby) są akceptowane przez obiekt JSON, nawet jeśli obiekt JSON jest technicznie zgodny z RFC 4627.
Zauważ, że możesz zatem określić liczbę w zgodnej przeglądarce za pośrednictwem
JSON.stringify(5)
, która zostanie odrzucona przez inny parser, który jest zgodny z RFC4627, ale który nie ma określonego wyjątku wymienionego powyżej. Na przykład Ruby wydaje się być jednym z takich przykładów, w którym jako root przyjmuje tylko obiekty i tablice . Z drugiej strony PHP specjalnie dodaje wyjątek, że „będzie również kodować i dekodować typy skalarne i NULL”.źródło
true
,false
albonull
sam jest ważny tekst JSON? Czy mógłbyś zacytować źródło, ponieważ jest to sprzeczne z większością innych odpowiedzi / komentarzy tutaj?W Internecie istnieją co najmniej cztery dokumenty, które można uznać za standardy JSON. Wszystkie odnośniki RFC opisują typ MIME
application/json
. Oto, co każdy ma do powiedzenia na temat wartości najwyższego poziomu i czy na górze jest dozwolone cokolwiek innego niż obiekt lub tablica:RFC-4627 : Nie.
Zwróć uwagę, że RFC-4627 został oznaczony jako „informacyjny” w przeciwieństwie do „proponowanego standardu” i jest przestarzały przez RFC-7159 , który z kolei został zastąpiony przez RFC-8259.
RFC-8259 : Tak.
RFC-8259 pochodzi z grudnia 2017 r. I jest oznaczony jako „INTERNET STANDARD”.
ECMA-262 : Tak.
ECMA-404 : Tak.
źródło
Zgodnie ze starą definicją w RFC 4627 (która została przestarzała w marcu 2014 r. Przez RFC 7159), wszystkie były poprawnymi „wartościami JSON”, ale tylko dwie ostatnie stanowiłyby pełny „tekst JSON”:
W zależności od używanego parsera, samotne „wartości JSON” mogą i tak zostać zaakceptowane. Na przykład (trzymanie się terminologii „wartość JSON” i „tekst JSON”):
JSON.parse()
funkcja teraz standaryzowane w nowoczesnych przeglądarek akceptuje żadnych „wartość” JSONjson_decode
została wprowadzona w wersji 5.2.0, akceptując tylko cały „tekst JSON”, ale została zmieniona tak, aby akceptowała każdą „wartość JSON” w wersji 5.2.1json.loads
akceptuje każdą „wartość JSON” zgodnie z przykładami na tej stronie podręcznikaRozróżnienie jest trochę podobne do rozróżnienia między „dokumentem XML” a „fragmentem XML”, chociaż technicznie
<foo />
jest to dobrze sformułowany dokument XML (lepiej byłoby napisać<?xml version="1.0" ?><foo />
, ale jak wskazano w komentarzach,<?xml
deklaracja jest technicznie opcjonalna ).źródło
<foo />
to dobrze sformułowany dokument XML, ale nie jest prawidłowy . (Ale to samo dotyczy<?xml version="1.0" ?><foo />
.)<foo />
może, ale nie musi, być ważny w odniesieniu do określonego schematu , ale nie to stwierdza ten standard.Specyfikacja ecma może być przydatna w celach informacyjnych:
http://www.ecma-international.org/ecma-262/5.1/
źródło
JSON.parse
Funkcja dodano następnie do nowszych wersjach standardu ECMAScript opartej na gramatyce Crockforda i RFC.JSON.parse("\"string\"");
JSON to skrót od JavaScript Object Notation. Tylko
{}
i[]
zdefiniuj obiekt Javascript. Inne przykłady to literały wartości. W JavaScript istnieją typy obiektów do pracy z tymi wartościami, ale wyrażenie"string"
jest reprezentacją wartości literału w kodzie źródłowym, a nie obiektem.Pamiętaj, że JSON to nie JavaScript. Jest to notacja reprezentująca dane. Ma bardzo prostą i ograniczoną strukturę. Dane JSON są uporządkowane przy użyciu
{},:[]
znaków. W tej strukturze można używać tylko wartości literałów.Serwer może w odpowiedzi podać opis obiektu lub wartość literalną. Wszystkie parsery JSON powinny obsługiwać tylko wartość literału, ale tylko jedną wartość. JSON może reprezentować tylko jeden obiekt naraz. Tak więc, aby serwer zwracał więcej niż jedną wartość, musiałby utworzyć strukturę jako obiekt lub tablicę.
źródło
Tak, tak, tak, tak i tak. Wszystkie z nich są prawidłowymi literałami wartości JSON.
Jednak oficjalny dokument RFC 4627 stwierdza:
Zatem cały „plik” powinien składać się z obiektu lub tablicy jako zewnętrznej struktury, która oczywiście może być pusta. Jednak wiele parserów JSON akceptuje również wartości pierwotne jako dane wejściowe.
źródło
Twoja odpowiedź brzmi,
"{}"
co oznacza pusty obiekt.źródło
undefined
, a nie "{}" `Wystarczy postępować zgodnie ze schematami kolejowymi zamieszczonymi na stronie json.org . [] i {} to minimalne możliwe poprawne obiekty JSON. Więc odpowiedź to [] i {}.
źródło
array
iobject
miałbyś rację, ale rozsądnie jest oczekiwać,value
że będziesz początkiem.values
regułę zamiast (lub oprócz) regułarray
iobject
, wówczas samodzielne liczby i ciągi znaków są prawidłowym dokumentem JSON.[]
chociaż poprawny tekst JSON pod każdą specyfikacją, która kiedykolwiek miała opinię w tej sprawie, nie jest „prawidłowym obiektem JSON”, ponieważ nie jest obiektem JSON. „Obiekt” w JSON odnosi się konkretnie do{}
notacji; Tablice JSON nie są obiektami JSON.