J'ai lu attentivement la description JSON http://json.org/ mais je ne suis pas sûr de connaître la réponse à la question simple. Quelles chaînes sont le minimum JSON valide possible?
"string"
la chaîne est-elle valide JSON?42
le nombre simple est-il JSON valide?true
la valeur booléenne est-elle un JSON valide?{}
l'objet vide est-il un JSON valide?[]
le tableau vide est-il un JSON valide?
javascript
json
validation
Bessarabov
la source
la source
Réponses:
Au moment de la rédaction de cet article, JSON était uniquement décrit dans la RFC4627 . Il décrit (au début de «2») un texte JSON comme étant un objet ou un tableau sérialisé.
Cela signifie que seules
{}
et[]
sont valides, des chaînes JSON complètes dans des analyseurs et des stringifiers qui adhèrent à cette norme.Cependant , l'introduction de l'ECMA-404 change cela, et les conseils mis à jour peuvent être lus ici . J'ai également écrit un article de blog sur la question.
Cependant, pour compliquer davantage les choses, l'
JSON
objet (par exempleJSON.parse()
etJSON.stringify()
) disponible dans les navigateurs Web est normalisé dans ES5 , et cela définit clairement les textes JSON acceptables comme suit:Cela signifierait que toutes les valeurs JSON (y compris les chaînes, les valeurs nulles et les nombres) sont acceptées par l'objet JSON, même si l'objet JSON adhère techniquement à la RFC 4627.
Notez que vous pouvez donc stringifier un nombre dans un navigateur conforme via
JSON.stringify(5)
, qui serait rejeté par un autre analyseur qui adhère à RFC4627, mais qui n'a pas l'exception spécifique répertoriée ci-dessus. Ruby, par exemple, semble être un exemple qui n'accepte des objets et des tableaux comme la racine . PHP, d'autre part, ajoute spécifiquement l'exception selon laquelle "il codera et décodera également les types scalaires et NULL".la source
true
,false
ounull
seul est un texte JSON valide? Pourriez-vous s'il vous plaît citer une source, car cela contredit la plupart des autres réponses / commentaires ici?Il existe au moins quatre documents qui peuvent être considérés comme des normes JSON sur Internet. Les RFC référencées décrivent toutes le type mime
application/json
. Voici ce que chacun a à dire sur les valeurs de niveau supérieur et si autre chose qu'un objet ou un tableau est autorisé en haut:RFC-4627 : Non.
Notez que la RFC-4627 a été marquée «informationnelle» par opposition à «norme proposée», et qu'elle est obsolète par la RFC-7159 , qui à son tour est obsolète par la RFC-8259.
RFC-8259 : Oui.
La RFC-8259 date de décembre 2017 et porte la mention "INTERNET STANDARD".
ECMA-262 : Oui.
ECMA-404 : Oui.
la source
Selon l'ancienne définition de la RFC 4627 (qui était obsolète en mars 2014 par la RFC 7159), il s'agissait toutes de «valeurs JSON» valides, mais seules les deux dernières constitueraient un «texte JSON» complet:
Selon l'analyseur utilisé, les seules "valeurs JSON" peuvent être acceptées de toute façon. Par exemple (en respectant la terminologie "valeur JSON" et "texte JSON"):
JSON.parse()
fonction désormais standardisée dans les navigateurs modernes accepte toute "valeur JSON"json_decode
été introduite dans la version 5.2.0 n'acceptant qu'un "texte JSON" entier, mais a été modifiée pour accepter toute "valeur JSON" dans la version 5.2.1json.loads
accepte toute "valeur JSON" selon les exemples de cette page de manuelLa distinction est un peu comme la distinction entre un "document XML" et un "fragment XML", bien que techniquement
<foo />
soit un document XML bien formé (il serait préférable de l'écrire comme<?xml version="1.0" ?><foo />
, mais comme indiqué dans les commentaires, la<?xml
déclaration est techniquement facultative ).la source
<foo />
est un document XML bien formé , mais pas valide . (Mais il en va de même pour<?xml version="1.0" ?><foo />
.)<foo />
peut-être ou non être valide contre un schéma particulier , mais ce n'est pas ce que dit cette norme.La spécification ecma peut être utile pour référence:
http://www.ecma-international.org/ecma-262/5.1/
la source
JSON.parse
fonction a ensuite été ajoutée aux versions ultérieures du standard ECMAScript basé sur la grammaire de Crockford et le RFC.JSON.parse("\"string\"");
JSON signifie JavaScript Object Notation. Seulement
{}
et[]
définissez un objet Javascript. Les autres exemples sont des valeurs littérales. Il existe des types d'objet en Javascript pour travailler avec ces valeurs, mais l'expression"string"
est une représentation en code source d'une valeur littérale et non d'un objet.Gardez à l'esprit que JSON n'est pas Javascript. C'est une notation qui représente des données. Il a une structure très simple et limitée. Les données JSON sont structurées à l'aide de
{},:[]
caractères. Vous ne pouvez utiliser que des valeurs littérales à l'intérieur de cette structure.Il est parfaitement valide pour un serveur de répondre avec une description d'objet ou une valeur littérale. Tous les analyseurs JSON doivent être gérés pour ne gérer qu'une valeur littérale, mais une seule valeur. JSON ne peut représenter qu'un seul objet à la fois. Donc, pour qu'un serveur renvoie plus d'une valeur, il devrait la structurer comme un objet ou un tableau.
la source
Oui, oui, oui, oui et oui. Tous sont des littéraux de valeur JSON valides.
Cependant, la RFC 4627 officielle déclare:
Ainsi, un "fichier" entier doit être constitué d'un objet ou d'un tableau en tant que structure la plus externe, qui bien sûr peut être vide. Pourtant, de nombreux analyseurs JSON acceptent également les valeurs primitives en entrée.
la source
Donc, votre réponse est
"{}"
qui désigne un objet vide.la source
undefined
, pas "{}" `Suivez simplement les schémas de chemin de fer donnés sur la page json.org . [] et {} sont les objets JSON valides minimum possibles. La réponse est donc [] et {}.
la source
array
et queobject
vous auriez raison, mais il est raisonnable de s'attendrevalue
à être le début.values
règle à la place (ou en plus) des règlesarray
etobject
, alors les nombres et les chaînes autonomes sont un document JSON valide.[]
alors qu'un texte JSON valide sous toutes les spécifications qui a déjà eu une opinion sur le sujet, n'est pas un "objet JSON valide", car ce n'est pas un objet JSON. «Objet» dans JSON fait spécifiquement référence à la{}
notation; Les tableaux JSON ne sont pas des objets JSON.