Un tableau peut-il être du texte JSON de niveau supérieur?


Réponses:


126

Oui, un tableau est légal en tant que texte JSON de niveau supérieur.

Il existe trois documents standard définissant JSON: RFC 4627 , RFC 7159 (qui rend obsolète la RFC 4627) et ECMA-404 . Ils diffèrent dans les éléments de niveau supérieur qu'ils autorisent, mais tous autorisent un objet ou un tableau comme élément de niveau supérieur.

  • RFC 4627: objet ou tableau.
    "Un texte JSON est un objet ou un tableau sérialisé."
  • RFC 7159: toute valeur JSON.
    "Un texte JSON est une valeur sérialisée."
  • ECMA-404: toute valeur JSON.
    "Un texte JSON est une séquence de jetons formés à partir de points de code Unicode qui sont conformes à la grammaire des valeurs JSON."

2
À partir de cette RFC plus récente , «Un texte JSON est une séquence de jetons. L'ensemble de jetons comprend six caractères structurels, des chaînes, des nombres et trois noms littéraux».
antak

63

Oui , mais vous devriez envisager de faire de la racine un objet à la place dans certains scénarios, en raison d' un détournement JSON . Il s'agit d'une vulnérabilité de divulgation d'informations basée sur le remplacement du constructeur de tableau en JavaScript.


11
Oui, c'est la marque d'une bonne réponse - non seulement dire au PO ce qu'il voulait savoir, mais aussi ce qu'il devrait savoir (mais qu'il ne réalisait pas). En fait, il existe un tas de vulnérabilités associées à JSON qui sont analysées en Javascript, le détournement JSON n'est qu'un exemple.
sleske


4

Cela provient de la spécification ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
Ceci est un peu trompeur, cependant, car ECMAScript vous permet d'analyser des chaînes JSON qui ne sont pas des textes de niveau supérieur. Selon la RFC, «un texte JSON est un objet ou un tableau sérialisé».
Matthew Flaschen

@Matthew - Bizarre, je me demande ce que pense Crockford à ce sujet. Comment concilieront-ils les différences entre le RFC et l'ECMA?
ChaosPandion

3
J'ai juste regardé et j'ai constaté qu'ils étaient conscients de la différence. D'après ECMAScript 5 §15.12, "La production JSONText de niveau supérieur de la grammaire ECMAScript JSON peut consister en n'importe quelle valeur JSONValue plutôt que d'être limitée à un JSONObject ou un JSONArray comme spécifié par RFC 4627." Je ne sais pas si l'IETF changera le RFC.
Matthew Flaschen

@Matthew - Merci pour cela, je devenais horriblement confus. La description de json.org ne mentionne pas le concept plus restrictif de « JSON texte » du tout , et le genre de RFC vague sur sa signification.
mrec

Cette réponse concerne ECMAScript, mais la question concerne JSON. Bien qu'ils se ressemblent (délibérément), ce sont des spécifications différentes .
sleske


1

Il y a une certaine confusion, vue dans les autres commentaires. Le type de média "application / json" autorise uniquement un objet ou un tableau au niveau supérieur pour le texte JSON , par RFC JSON . Cependant, pour un analyseur, toute valeur JSON est acceptable, comme indiqué dans la spécification ECMAScript.


Toute valeur JSON comme élément de niveau supérieur est acceptable pour un analyseur ECMAScript , mais pas pour un analyseur JSON (conforme) - distinction importante.
sleske

C'est une distinction intéressante, mais je ne comprends pas ce que vous dites. Quelle est la définition d'un "analyseur JSON (conforme)"?
cdunn2001

1
Eh bien, un analyseur JSON est un analyseur de la grammaire JSON. Bien que JSON ressemble à Javascript, il s'agit d'une grammaire différente (beaucoup plus simple). Voir tools.ietf.org/html/rfc7159 , qui décrit la grammaire JSON. «conforme» signifie simplement que l'analyseur suit en fait la grammaire (ce que tout analyseur décent devrait).
sleske

3
La RFC 4627 est obsolète, veuillez ne plus la suivre. La nouvelle RFC autorise également des valeurs simples au niveau supérieur.
Matthias Dieter Wallnöfer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.