198 votes

Quel est le minimum de JSON valide?

J'ai lu attentivement la description JSON http://json.org/ mais je ne suis pas sûr que je connais la réponse à la question simple. Quelles cordes sont le minimum possible JSON valide?

  • "string" est la chaîne JSON valide?
  • 42 , c'est le simple nombre JSON valide?
  • true est la valeur booléenne d'une JSON valide?
  • {} est le vide d'un objet JSON valide?
  • [] est le tableau vide un JSON valide?

172voto

Matt Points 38395

Au moment de la rédaction, JSON a été entièrement décrit dans RFC4627. Il décrit (au début de "2") au format JSON texte comme un objet sérialisé ou d'un tableau.

Cela signifie que seulement {} et [] sont valides, complètes chaînes JSON dans les analyseurs et stringifiers qui adhèrent à cette norme.

Toutefois, l'introduction de l'ECMA-404 changements, et la mise à jour des conseils peut être lu ici. J'ai aussi écrit un billet de blog sur le sujet.


Confondre la question, cependant, l' JSON objet (par exemple, JSON.parse() et JSON.stringify()), disponibles dans les navigateurs web est standardisé dans l'ES5, et qui définit clairement l'acceptable JSON textes comme ceci:

Le JSON format d'échange utilisé dans la présente spécification est exactement ce que décrit par la RFC 4627 à deux exceptions près:

  • Le haut niveau de JSONText de production de l'ECMAScript JSON grammaire peut consister en tout JSONValue plutôt que d'être restreint à un JSONObject ou un JSONArray comme spécifié par la RFC 4627.

  • ciselée

Cela signifierait que tous JSON valeurs (y compris les chaînes, les valeurs null et numéros) sont acceptées par l'objet JSON, même si l'objet JSON techniquement conforme à la norme RFC 4627.

Notez que vous pouvez donc stringify un nombre dans un navigateur conforme par JSON.stringify(5), qui serait rejetée par un autre analyseur qui adhère à RFC4627, mais qui n'a pas l'exception spécifiques énumérés ci-dessus. Ruby, par exemple, semble être un exemple qui seulement accepte les objets et les tableaux en tant que root. PHP, d'autre part, plus spécifiquement, ajoute l'exception que "il permettra également d'encoder et de décoder les types scalaires et NULL".

44voto

Johann Points 750

Il y a au moins quatre documents (rfc-7159 être considérée comme une continuation de la rfc-7158) qui peut être considéré comme JSON normes sur l'Internet. Les trois premiers Rfc décrire le type mime application/json. Voici ce que chacun a à dire sur le haut niveau des valeurs:

RFC 4627: Aucun.

Un JSON texte est une suite de jetons. L'ensemble de jetons comprend six structurelle des caractères, des chaînes, des nombres, et trois noms de littérales.

Un JSON texte est un objet sérialisé ou d'un tableau.

JSON-texte = objet / tableau

Notez que la RFC 4627 était marqué "information" plutôt que le "projet de norme", et qu'il est rendu obsolète par la RFC-7158 et RFC-7159.

RFC-7158: Oui. ( rév. bis-08)

(Voir la RFC-7159, qui est actuellement identique.)

RFC-7159: Oui.

Un JSON texte est sérialisé valeur. Notez que certaines précédente les spécifications de JSON contraint un JSON texte à un objet ou à un tableau. Implémentations qui ne produisent que des objets ou des tableaux où un JSON texte est appelé pour l'interopérabilité dans le sens que tous les les implémentations de l'accepter comme conforme JSON textes.

JSON-texte = ws valeur ws

Notez que la RFC-7159 existe tout simplement parce que la date de publication de la RFC-7158 a été publié par erreur "Mars 2013" quand il a été mis à jour en Mars 2014 (source).

ECMA-262: Oui.

Le JSON Syntaxique de la Grammaire définit un JSON valide texte en termes de jetons défini par le JSON lexicale de la grammaire. L'objectif symbole de la grammaire est JSONText.

La syntaxe JSONText :

JSONValue

JSONValue :

JSONNullLiteral

JSONBooleanLiteral

JSONObject

JSONArray

JSONString

JSONNumber

ECMA-404: Oui.

Un JSON texte est une suite de jetons formé à partir de points de code Unicode qui est conforme à la valeur JSON de la grammaire. L'ensemble de jetons comprend six structurelle des jetons, des chaînes de caractères, nombres, et trois littérale du nom de jetons.

10voto

IMSoP Points 16089

Selon la définition donnée dans la norme RFC 4627, ceux sont tous valides "JSON valeurs", mais seuls les deux derniers constituerait un "JSON text":

Un JSON texte est un objet sérialisé ou d'un tableau.

En fonction de l'analyseur utilisé, le seul "JSON valeurs" peut-être accepté de toute façon. Par exemple (respect de la "valeur JSON" vs "JSON" texte de la terminologie):

  • l' JSON.parse() fonction standardisé dans les navigateurs modernes accepte la "valeur JSON"
  • la fonction PHP json_decode a été introduit dans la version 5.2.0 seulement l'acceptation d'un ensemble de "JSON texte", mais a été modifié pour accepter toute "valeur JSON" dans la version 5.2.1
  • Python json.loads accepte la "valeur JSON", selon les exemples sur cette page de manuel
  • le validateur au http://jsonlint.com s'attend à un "JSON texte"
  • le Rubis JSON module de n'accepter qu'un plein "JSON texte" (du moins d'après 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 /> est un document XML bien formé (il serait mieux rédigé comme <?xml version="1.0" ?><foo />, mais comme souligné dans les commentaires, l' <?xml déclaration est techniquement en option).

4voto

emilos Points 1072

La spécification ecma pourraient être utiles pour la référence:

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

La fonction d'analyse analyse un texte JSON (une Chaîne au format JSON) et produit un ECMAScript valeur. L' Le format JSON est une forme restreinte d'ECMAScript littérale. Objets JSON sont rendu compte que ECMAScript objets. JSON tableaux sont rendu compte que ECMAScript tableaux. JSON chaînes de caractères, nombres, booléens, et null sont rendu compte que ECMAScript Chaînes de caractères, Nombres, Booléens, et null. JSON utilise un ensemble limité de caractères blancs que les Espaces et permet des points de code Unicode U+2028 et U+2029 directement apparaissent dans JSONString littéraux sans l'aide d'une séquence d'échappement. Le processus d'analyse est similaire à 11.1.4 et 11.1.5 en tant que contrainte 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("[]"); // []

2voto

Bergi Points 104242

Oui, oui, oui, oui et oui. Tous sont JSON valide la valeur de littéraux.

Cependant, l'officiel du RFC 4627 états:

Un JSON texte est un objet sérialisé ou d'un tableau.

C'est donc tout un "fichier" doit consister en un objet ou un tableau comme de l'extérieur de la structure, ce qui bien sûr peut être vide. Pourtant, de nombreux JSON analyseurs accepter des valeurs primitives aussi bien pour l'entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X