Kann ein Array JSON-Text der obersten Ebene sein?


Antworten:


126

Ja, ein Array ist als JSON-Text der obersten Ebene zulässig.

Es gibt drei Standarddokumente, die JSON definieren: RFC 4627 , RFC 7159 (wodurch RFC 4627 veraltet ist) und ECMA-404 . Sie unterscheiden sich darin, welche Elemente der obersten Ebene sie zulassen, aber alle erlauben ein Objekt oder ein Array als Element der obersten Ebene.

  • RFC 4627: Objekt oder Array.
    "Ein JSON-Text ist ein serialisiertes Objekt oder Array."
  • RFC 7159: Beliebiger JSON-Wert.
    "Ein JSON-Text ist ein serialisierter Wert."
  • ECMA-404: Beliebiger JSON-Wert.
    "Ein JSON-Text ist eine Folge von Token, die aus Unicode-Codepunkten gebildet werden und der JSON-Wertgrammatik entsprechen."

2
Ab diesem neueren RFC ist "Ein JSON-Text eine Folge von Token. Der Satz von Token enthält sechs strukturelle Zeichen, Zeichenfolgen, Zahlen und drei Literalnamen."
Antak

63

Ja , aber Sie sollten in einigen Szenarien aufgrund von JSON-Hijacking in Betracht ziehen, den Stamm stattdessen zu einem Objekt zu machen . Dies ist eine Sicherheitsanfälligkeit bezüglich der Offenlegung von Informationen, die auf dem Überschreiben des Array-Konstruktors in JavaScript basiert.


11
Ja, das ist das Kennzeichen einer großartigen Antwort - nicht nur dem OP zu sagen, was sie wissen wollten, sondern auch, was sie wissen sollten (aber nicht realisierten). Tatsächlich gibt es eine Reihe von Sicherheitslücken im Zusammenhang mit JSON, die als Javascript analysiert werden. JSON-Hijacking ist nur ein Beispiel.
Sleske


4

Dies ist aus der ECMAScript-Spezifikation.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
Dies ist jedoch etwas irreführend, da Sie mit ECMAScript JSON-Zeichenfolgen analysieren können, die keine Texte der obersten Ebene sind. Laut RFC ist "ein JSON-Text ein serialisiertes Objekt oder Array."
Matthew Flaschen

@ Matthew - Seltsam, ich frage mich, wie Crockford sich dabei fühlt. Wie werden sie die Unterschiede zwischen RFC und ECMA in Einklang bringen?
ChaosPandion

3
Ich habe nur nachgesehen und festgestellt, dass sie sich des Unterschieds bewusst sind. Aus ECMAScript 5 §15.12, "Die JSONText-Produktion der obersten Ebene der ECMAScript-JSON-Grammatik kann aus einem beliebigen JSONValue bestehen, anstatt darauf beschränkt zu sein, ein JSONObject oder ein JSONArray zu sein, wie in RFC 4627 angegeben." Ich weiß nicht, ob IETF den RFC ändern wird.
Matthew Flaschen

@ Matthew - Danke dafür, ich wurde schrecklich verwirrt. In der Beschreibung von json.org wird das restriktivere Konzept von "json-text" überhaupt nicht erwähnt , und die vage Bedeutung des RFC in Bezug auf seine Bedeutung.
mrec

Diese Antwort bezieht sich auf ECMAScript, aber die Frage bezieht sich auf JSON. Während sie (absichtlich) ähnlich aussehen, sind sie unterschiedliche Spezifikationen .
Sleske


1

Es gibt einige Verwirrung, die in den anderen Kommentaren zu sehen ist. Der Medientyp "application / json" erlaubt nur Objekte oder Arrays auf der obersten Ebene für JSON-Text pro JSON-RFC . Für einen Parser ist jedoch jeder JSON-Wert akzeptabel, wie in der ECMAScript-Spezifikation angegeben.


Jeder JSON-Wert als Element der obersten Ebene ist für einen ECMAScript-Parser akzeptabel , nicht jedoch für einen (kompatiblen) JSON-Parser - wichtige Unterscheidung.
Sleske

Das ist eine interessante Unterscheidung, aber ich verstehe nicht, was Sie sagen. Was ist die Definition eines "(kompatiblen) JSON-Parsers"?
cdunn2001

1
Nun, ein JSON-Parser ist ein Parser für die JSON-Grammatik. Während JSON Javascript ähnelt, ist es eine andere (viel einfachere) Grammatik. Siehe tools.ietf.org/html/rfc7159 , in dem die JSON-Grammatik beschrieben wird. "konform" bedeutet nur, dass der Parser tatsächlich der Grammatik folgt (was jeder anständige Parser tun sollte).
Sleske

3
RFC 4627 ist veraltet, bitte folgen Sie ihm nicht mehr. Der neue RFC erlaubt auch einfache Werte auf oberster Ebene.
Matthias Dieter Wallnöfer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.