Quel est le minimum de JSON valide?

j'ai lu attentivement le JSON description http://json.org/ mais je ne suis pas sûr que je connais la réponse à la question simple. Quelles sont les conditions minimales de validité de JSON?

  • "string" la chaîne est-elle valide JSON?
  • 42 le simple numéro est-il valide JSON?
  • true est - ce que la valeur booléenne est un JSON valide?
  • {} est le vide un objet JSON valide?
  • [] est-ce que le tableau vide est un JSON valide?
119
demandé sur joshperry 2013-08-24 18:08:50

8 réponses

au moment de la rédaction du présent rapport, JSON était uniquement décrite dans RFC4627 . Il décrit (au début de "2") un texte JSON comme étant un objet ou un tableau sérialisé.

cela signifie que seulement {} et [] sont des chaînes JSON valides et complètes dans des parsers et des stringifiers qui adhèrent à cette norme.

cependant , l'introduction de L'ECMA-404 modifie que, et le Conseil mis à jour peut être lu ici . J'ai également écrit un billet de blog sur la question.


pour embrouiller davantage la question, cependant , l'objet JSON (par exemple JSON.parse() et JSON.stringify() ) disponible dans les navigateurs web est standardisé dans ES5 , et qui définit clairement les textes acceptables JSON comme:

le JSON le format d'échange utilisé dans cette spécification est exactement celui décrit dans la RFC 4627 avec deux exceptions:

  • la production JSONText de haut niveau de la grammaire ECMAScript JSON peut consister en n'importe quelle valeur JSON plutôt que d'être limité à être un JSONObject ou un JSONArray comme spécifié par la RFC 4627.

  • ciselée

cela signifierait que toutes les valeurs de JSON (y compris les chaînes, les nulls 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 énumérée ci-dessus. Ruby, par exemple, semble être un exemple qui seulement accepte les objets et les tableaux comme la racine . PHP, d'un autre côté, ajoute spécifiquement l'exception que "il encodera et décodera aussi les types scalaires et NULL".

107
répondu Matt 2017-05-23 12:10:26

il y a au moins quatre documents qui peuvent être considérés comme des normes JSON sur Internet. Les RFC Cités décrivent tous le type mime application/json . Voici ce que chacun a à dire sur les valeurs de haut niveau, et si autre chose qu'un objet ou un tableau est autorisé au sommet:

RFC-4627 : - non, non.

un texte JSON est une séquence de jetons. L'ensemble des jetons comprend six les caractères structuraux, les chaînes, les nombres, et trois noms littéraux.

un texte JSON est un objet ou tableau sérialisé.

JSON-texte = objet / tableau

notez que la RFC-4627 portait la mention "informational" par opposition à" proposed standard", et qu'elle est obsolète par RFC-7159 , qui à son tour est obsolète par RFC-8259.

RFC-8259 : Oui, c'est ça.

un texte JSON est une séquence de jetons. L'ensemble des jetons comprend six les caractères structuraux, les chaînes, les nombres, et trois noms littéraux.

un texte JSON est une valeur sérialisée. Notez que certains précédents les spécifications de JSON ont contraint un texte JSON à être un objet ou un tableau. Les implémentations qui ne génèrent que des objets ou des tableaux Le texte de JSON est appelé à être interopérable en ce sens que tous les les implémentations accepteront ces textes JSON comme conformes.

JSON-texte = ws valeur ws

RFC-8259 est datée de décembre 2017 et est marquée "INTERNET STANDARD".

ECMA-262 : Oui.

la grammaire syntaxique JSON définit un texte JSON valide en termes de jetons définis par le lexique JSON. grammaire. Le symbole de but de la grammaire est JSONText.

Syntaxe

JSONText:

JSONValue

JSONValue:

JSONNullLiteral

JSONBooleanLiteral

JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404 : Oui, c'est ça.

un texte JSON est une séquence de jetons formés à partir de points de code Unicode qui est conforme à la valeur JSON grammaire. L'ensemble des tokens comprend six tokens structuraux, des chaînes, des nombres et trois tokens de noms littéraux.

32
répondu Johann 2018-07-19 17:06:22

selon l'ancienne définition dans RFC 4627 (qui a été obsolète en mars 2014 par RFC 7159), celles-ci étaient toutes des "valeurs JSON" valides, mais seulement les deux dernières constitueraient un "texte JSON" complet:

un texte JSON est un objet ou tableau sérialisé.

selon l'analyseur utilisé, les seules "valeurs JSON" peuvent être acceptées de toute façon. Par exemple (s'en tenir à la "valeur JSON" vs " texte JSON" la terminologie):

  • la fonction JSON.parse() désormais standardisée dans les navigateurs modernes accepte toute "valeur JSON "
  • la fonction PHP json_decode a été introduite dans la version 5.2.0 n'acceptant qu'un "texte JSON" complet, mais a été modifié pour accepter toute "valeur JSON" dans la version 5.2.1
  • Python's json.loads accepte n'importe quelle "valeur JSON" selon les exemples sur cette page de manuel
  • le validateur à http://jsonlint.com s'attend à un "texte JSON" complet
  • le module Ruby JSON n'accepte qu'un "texte JSON" complet (au moins selon les commentaires sur cette page de manuel )

la distinction est un peu comme la distinction entre un "document XML" et un "fragment XML", bien que techniquement <foo /> soit un document XML bien structuré (il serait préférable d'écrire <?xml version="1.0" ?><foo /> , mais comme il est souligné dans les commentaires, la déclaration <?xml est techniquement facultative).

9
répondu IMSoP 2015-12-25 12:42:35

JSON signifie JavaScript Object Notation. Seuls {} et [] définissent un objet Javascript. Les autres exemples sont des valeurs littérales. Il existe des types d'objets dans Javascript pour travailler avec ces valeurs, mais l'expression "string" est une représentation du 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 les données. Il a une structure très simple et limitée. JSON data is structuré en utilisant les 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 maniés pour gérer juste une valeur littérale, mais une seule valeur. JSON ne peut représenter qu'un seul objet à la fois. Donc pour un serveur de revenir plus d'une valeur qu'elle aurait à le structurer comme un objet ou un tableau.

3
répondu cgTag 2013-08-24 14:47:43

la spécification ecma peut être utile pour référence:

http://www.ecma-international.org/ecma-262/5.1 /

la fonction parse analyse un texte JSON (une chaîne formatée par JSON) et produit une valeur ECMAScript. Le Le format JSON est une forme restreinte d'ECMAScript littéral. Les objets JSON sont réalisés comme des objets ECMAScript. Les tableaux JSON sont réalisés en tant que tableaux ECMAScript. JSON strings, numbers, booléens, et null sont réalisés comme ECMAScript Chaînes de caractères, Nombres, Booléens, et null. JSON utilise un ensemble plus limité de caractères blancs permet aux points de code Unicode U+2028 et U+2029 d'apparaître directement dans la littérature JSONString sans utiliser une séquence d'évasion. Le processus d'analyse est similaire à 11.1.4 et 11.1.5 comme limité par le JSON de la grammaire.

JSON.parse("string"); // SyntaxError: Unexpected token s
JSON.parse(43); // 43
JSON.parse("43"); // 43
JSON.parse(true); // true
JSON.parse("true"); // true
JSON.parse(false);
JSON.parse("false");
JSON.parse("trueee"); // SyntaxError: Unexpected token e
JSON.parse("{}"); // {}
JSON.parse("[]"); // []
2
répondu Emil A. 2013-08-24 14:19:25

Oui, oui, oui, oui et oui. Tous sont de bons indicateurs de la valeur JSON.

Toutefois, le fonctionnaire RFC 4627 : le

un texte JSON est un objet ou tableau sérialisé.

ainsi, un" fichier " complet devrait être composé d'un objet ou d'un tableau comme la structure la plus externe, qui, bien sûr, peut être vide. Pourtant, de nombreux analyseurs JSON acceptent des valeurs primitives aussi bien pour l'entrée.

1
répondu Bergi 2013-08-24 14:18:29
var x;
JSON.stringify(x); // will output "{}"

donc votre réponse est "{}" qui dénote un objet vide.

-1
répondu Jani Hyytiäinen 2013-08-24 14:50:46

il suffit de suivre les diagrammes de chemin de fer donnés sur le json.org page. [] et {} sont le minimum possible valide objets JSON. Donc la réponse est [] et {}.

-2
répondu Hrishi 2015-12-25 12:48:12