Ich habe die JSON-Beschreibung http://json.org/ sorgfältig gelesen , bin mir aber nicht sicher, ob ich die Antwort auf die einfache Frage kenne. Welche Zeichenfolgen sind das minimal mögliche gültige JSON?
"string"
Ist die Zeichenfolge JSON gültig?42
Ist die einfache Zahl JSON gültig?true
Ist der boolesche Wert ein gültiger JSON?{}
Ist das leere Objekt ein gültiger JSON?[]
Ist das leere Array ein gültiger JSON?
javascript
json
validation
Bessarabov
quelle
quelle
Antworten:
Zum Zeitpunkt des Schreibens war JSON ausschließlich in RFC4627 beschrieben . Es beschreibt (am Anfang von "2") einen JSON-Text als ein serialisiertes Objekt oder Array.
Dies bedeutet , dass nur
{}
und[]
gültig, komplett JSON - Strings in Parsern und stringifiers diesen Standard beitretenden sind.Die Einführung von ECMA-404 ändert dies jedoch, und die aktualisierten Hinweise können hier gelesen werden . Ich habe auch einen Blog-Beitrag zu diesem Thema geschrieben.
Um die Angelegenheit jedoch weiter zu verwirren, ist das in Webbrowsern verfügbare
JSON
Objekt (z. B.JSON.parse()
undJSON.stringify()
) in ES5 standardisiert , und dies definiert die akzeptablen JSON-Texte wie folgt klar:Dies würde bedeuten, dass alle JSON-Werte (einschließlich Zeichenfolgen, Nullen und Zahlen) vom JSON-Objekt akzeptiert werden, obwohl das JSON-Objekt technisch RFC 4627 entspricht.
Beachten Sie, dass Sie daher eine Nummer in einem konformen Browser über kennzeichnen können
JSON.stringify(5)
, die von einem anderen Parser abgelehnt wird, der RFC4627 entspricht, für den jedoch die oben aufgeführte spezifische Ausnahme nicht gilt. Ruby zum Beispiel scheint ein solches Beispiel zu sein, das nur Objekte und Arrays als Root akzeptiert . PHP hingegen fügt ausdrücklich die Ausnahme hinzu, dass "es auch Skalartypen und NULL codiert und decodiert".quelle
true
,false
oder istnull
allein ein gültiger JSON-Text? Könnten Sie bitte eine Quelle angeben, da dies den meisten anderen Antworten / Kommentaren hier widerspricht?Es gibt mindestens vier Dokumente, die im Internet als JSON-Standards gelten können. Die RFCs, auf die alle verwiesen werden, beschreiben den MIME-Typ
application/json
. Hier ist, was jeder über die Werte der obersten Ebene zu sagen hat und ob oben etwas anderes als ein Objekt oder ein Array zulässig ist:RFC-4627 : Nein.
Beachten Sie, dass RFC-4627 im Gegensatz zu "vorgeschlagener Standard" als "informativ" gekennzeichnet wurde und dass es durch RFC-7159 veraltet ist, das wiederum durch RFC-8259 veraltet ist.
RFC-8259 : Ja.
RFC-8259 ist vom Dezember 2017 datiert und mit "INTERNET STANDARD" gekennzeichnet.
ECMA-262 : Ja.
ECMA-404 : Ja.
quelle
Nach der alten Definition in RFC 4627 (die im März 2014 von RFC 7159 überholt wurde) waren dies alles gültige "JSON-Werte", aber nur die letzten beiden würden einen vollständigen "JSON-Text" darstellen:
Abhängig vom verwendeten Parser werden die einzelnen "JSON-Werte" möglicherweise trotzdem akzeptiert. Zum Beispiel (Festhalten an der Terminologie "JSON-Wert" vs. "JSON-Text"):
JSON.parse()
jetzt in modernen Browsern standardisierte Funktion akzeptiert jeden "JSON-Wert".json_decode
wurde in Version 5.2.0 eingeführt und akzeptiert nur einen ganzen "JSON-Text", wurde jedoch geändert, um jeden "JSON-Wert" in Version 5.2.1 zu akzeptierenjson.loads
akzeptiert jeden "JSON-Wert" gemäß den Beispielen auf dieser HandbuchseiteDie Unterscheidung ähnelt der Unterscheidung zwischen einem "XML-Dokument" und einem "XML-Fragment", obwohl es sich technisch gesehen
<foo />
um ein wohlgeformtes XML-Dokument handelt (es wäre besser geschrieben<?xml version="1.0" ?><foo />
, aber wie in den Kommentaren erwähnt, ist die<?xml
Deklaration technisch optional ).quelle
<foo />
ist ein wohlgeformtes XML-Dokument, aber kein gültiges . (Aber das gleiche gilt für<?xml version="1.0" ?><foo />
.)<foo />
könnte dies für ein bestimmtes Schema gültig sein oder nicht , aber das ist nicht das, was dieser Standard angibt.Die Ecma-Spezifikation kann als Referenz nützlich sein:
http://www.ecma-international.org/ecma-262/5.1/
quelle
JSON.parse
Funktion wurde dann späteren Versionen des ECMAScript-Standards hinzugefügt, die auf der Crockford-Grammatik und dem RFC basieren.JSON.parse("\"string\"");
JSON steht für JavaScript Object Notation. Nur
{}
und[]
definieren Sie ein Javascript-Objekt. Die anderen Beispiele sind Werteliterale. In Javascript gibt es Objekttypen für die Arbeit mit diesen Werten, aber der Ausdruck"string"
ist eine Quellcodedarstellung eines Literalwerts und kein Objekt.Beachten Sie, dass JSON kein Javascript ist. Es ist eine Notation, die Daten darstellt. Es hat eine sehr einfache und begrenzte Struktur. JSON-Daten sind mit
{},:[]
Zeichen strukturiert . Sie können nur Literalwerte innerhalb dieser Struktur verwenden.Es ist vollkommen gültig, dass ein Server entweder mit einer Objektbeschreibung oder einem Literalwert antwortet. Alle JSON-Parser sollten so behandelt werden, dass sie nur einen Literalwert, aber nur einen Wert verarbeiten. JSON kann jeweils nur ein Objekt darstellen. Damit ein Server mehr als einen Wert zurückgeben kann, muss er ihn als Objekt oder Array strukturieren.
quelle
Ja, ja, ja, ja und ja. Alle von ihnen sind gültige JSON-Werteliterale.
Der offizielle RFC 4627 besagt jedoch:
Eine ganze "Datei" sollte also aus einem Objekt oder Array als äußerster Struktur bestehen, die natürlich leer sein kann. Viele JSON-Parser akzeptieren jedoch auch primitive Werte für die Eingabe.
quelle
Ihre Antwort lautet also,
"{}"
was ein leeres Objekt bezeichnet.quelle
undefined
nicht "{}" `Folgen Sie einfach den Eisenbahndiagrammen auf der Seite json.org . [] und {} sind die minimal möglichen gültigen JSON-Objekte. Die Antwort lautet also [] und {}.
quelle
array
undobject
Sie Recht hätten, ist es vernünftig zu erwartenvalue
, dass dies der Start ist.values
Regel stattdessen (oder zusätzlich zu) den Regelnarray
und ansehenobject
, sind eigenständige Zahlen und Zeichenfolgen ein gültiges JSON-Dokument.[]
Während ein gültiger JSON-Text unter jeder Spezifikation, die jemals eine Meinung zu diesem Thema hatte, kein "gültiges JSON-Objekt" ist, da es sich nicht um ein JSON-Objekt handelt. "Objekt" in JSON bezieht sich speziell auf die{}
Notation; JSON-Arrays sind keine JSON-Objekte.