Czy tablica może być tekstem JSON najwyższego poziomu?

Odpowiedzi:

126

Tak, tablica jest legalna jako tekst JSON najwyższego poziomu.

Istnieją trzy standardowe dokumenty definiujące format JSON: RFC 4627 , RFC 7159 (który zastępuje RFC 4627) i ECMA-404 . Różnią się one dozwolonymi elementami najwyższego poziomu, ale wszystkie dopuszczają obiekt lub tablicę jako element najwyższego poziomu.

  • RFC 4627: obiekt lub tablica.
    „Tekst JSON to serializowany obiekt lub tablica”.
  • RFC 7159: dowolna wartość JSON.
    „Tekst JSON to zserializowana wartość”.
  • ECMA-404: dowolna wartość JSON.
    „Tekst JSON to sekwencja tokenów utworzona z punktów kodowych Unicode, która jest zgodna z gramatyką wartości JSON”.
sleske
źródło
2
W nowszym dokumencie RFC „Tekst JSON to sekwencja tokenów. Zestaw tokenów zawiera sześć znaków strukturalnych, ciągi, liczby i trzy nazwy literałów”.
antak
64

Tak , ale zamiast tego w niektórych scenariuszach powinieneś rozważyć uczynienie roota obiektem z powodu przechwytywania JSON . Jest to luka umożliwiająca ujawnienie informacji polegająca na przesłonięciu konstruktora tablicy w JavaScript.

Matthew Flaschen
źródło
11
Tak, to cecha charakterystyczna świetnej odpowiedzi - nie tylko mówienie OP, co chcieli wiedzieć, ale także co powinni wiedzieć (ale nie zdawali sobie sprawy). W rzeczywistości istnieje kilka luk w zabezpieczeniach związanych z JSON, które analizuje się jako JavaScript, a przechwytywanie JSON to tylko jeden przykład.
sleske
9
FWIW, przechwytywanie JSON nie jest problemem dla nowoczesnych przeglądarek .
Franklin Yu
4

To pochodzi ze specyfikacji ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber
ChaosPandion
źródło
1
Jest to jednak trochę mylące, ponieważ ECMAScript umożliwia analizowanie ciągów JSON, które nie są tekstami najwyższego poziomu. Zgodnie ze specyfikacją RFC „tekst JSON to serializowany obiekt lub tablica”.
Matthew Flaschen,
@Matthew - Dziwne, zastanawiam się, co o tym myśli Crockford. Jak pogodzą różnice między RFC i ECMA?
ChaosPandion
3
Po prostu spojrzałem i stwierdziłem, że są świadomi różnicy. Od ECMAScript 5 §15.12, „Produkcja JSONText najwyższego poziomu gramatyki ECMAScript JSON może składać się z dowolnej wartości JSONValue, a nie być ograniczona do obiektu JSONObject lub JSONArray, jak określono w RFC 4627.” Nie wiem, czy IETF zmieni RFC.
Matthew Flaschen
@Matthew - Dzięki za to, byłem strasznie zdezorientowany. Opis json.org nie wspominając o bardziej restrykcyjne pojęcie „json tekstu” w ogóle , i rodzaju RFC dotyczącą niejasne o jego znaczeniu.
mrec
Ta odpowiedź dotyczy ECMAScript, ale pytanie dotyczy JSON. Chociaż (celowo) wyglądają podobnie, mają różne specyfikacje .
sleske
2

tak, wypróbuj tutaj.

http://www.jsonlint.com/

i wstaw [{}]

hvgotcodes
źródło
3
To jest jeszcze łatwiejsze. Włóż, []a to potwierdzi.
sorpigal
Link nie działa, zaktualizuj lub usuń tę - prawie tylko link - odpowiedź.
Anthon
1

W innych komentarzach jest pewne zamieszanie. Typ nośnika „aplikacja / json” dopuszcza tylko obiekt lub tablicę na najwyższym poziomie dla tekstu JSON , według JSON RFC . Jednak dla parsera akceptowalna jest każda wartość JSON, jak widać w specyfikacji ECMAScript.

cdunn2001
źródło
Każda wartość JSON jako element najwyższego poziomu jest akceptowalna dla parsera ECMAScript , ale nie dla (zgodnego) parsera JSON - ważna różnica.
sleske
To interesujące rozróżnienie, ale nie rozumiem, o czym mówisz. Jaka jest definicja „(zgodnego) parsera JSON”?
cdunn2001
1
Cóż, parser JSON jest parserem dla gramatyki JSON. Chociaż JSON wygląda podobnie do Javascript, jest to inna (znacznie prostsza) gramatyka. Zobacz tools.ietf.org/html/rfc7159 , gdzie opisano gramatykę JSON. „zgodny” oznacza po prostu, że parser faktycznie postępuje zgodnie z gramatyką (którą powinien każdy przyzwoity parser).
sleske
3
RFC 4627 jest nieaktualny, prosimy o nieużywanie go. Nowy RFC dopuszcza również proste wartości na najwyższym poziomie.
Matthias Dieter Wallnöfer