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”.

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.


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


4

To pochodzi ze specyfikacji ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.