¿Puede una matriz ser texto JSON de nivel superior?

Respuestas:

126

Sí, una matriz es legal como texto JSON de nivel superior.

Hay tres documentos estándar que definen JSON: RFC 4627 , RFC 7159 (que deja obsoleto a RFC 4627) y ECMA-404 . Se diferencian en qué elementos de nivel superior permiten, pero todos permiten un objeto o una matriz como elemento de nivel superior.

  • RFC 4627: Objeto o matriz.
    "Un texto JSON es un objeto serializado o una matriz".
  • RFC 7159: cualquier valor JSON.
    "Un texto JSON es un valor serializado".
  • ECMA-404: cualquier valor JSON.
    "Un texto JSON es una secuencia de tokens formada a partir de puntos de código Unicode que se ajusta a la gramática del valor JSON".
sleske
fuente
2
A partir de este RFC más reciente , "Un texto JSON es una secuencia de tokens. El conjunto de tokens incluye seis caracteres estructurales, cadenas, números y tres nombres literales".
antak
63

, pero debería considerar convertir la raíz en un objeto en algunos escenarios, debido al secuestro de JSON . Esta es una vulnerabilidad de divulgación de información basada en anular el constructor de matriz en JavaScript.

Matthew Flaschen
fuente
11
Sí, ese es el sello distintivo de una gran respuesta: no solo decirle al OP lo que querían saber, sino también lo que deberían saber (pero no se dieron cuenta). En realidad, hay un montón de vulnerabilidades asociadas con JSON que se analiza como Javascript, el secuestro de JSON es solo un ejemplo.
sábado
9
FWIW, el secuestro de JSON no es un problema para los navegadores modernos .
Franklin Yu
4

Esto es de la especificación ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber
ChaosPandion
fuente
1
Sin embargo, esto es un poco engañoso porque ECMAScript le permite analizar cadenas JSON que no son textos de nivel superior. Según la RFC, "un texto JSON es un objeto o matriz serializado".
Matthew Flaschen
@Matthew - Qué raro, me pregunto cómo se siente Crockford al respecto. ¿Cómo conciliarán las diferencias entre RFC y ECMA?
ChaosPandion
3
Solo miré y descubrí que son conscientes de la diferencia. De ECMAScript 5 §15.12, "La producción de JSONText de nivel superior de la gramática JSON de ECMAScript puede consistir en cualquier JSONValue en lugar de limitarse a ser un JSONObject o un JSONArray según lo especificado por RFC 4627". No sé si IETF cambiará el RFC.
Matthew Flaschen
@Matthew - Gracias por eso, me estaba confundiendo terriblemente. La descripción de json.org no menciona el concepto más restrictivo de "json-text" en absoluto , y el RFC es un poco vago sobre su significado.
mrec
Esta respuesta es sobre ECMAScript, pero la pregunta es sobre JSON. Si bien (deliberadamente) se ven similares, son especificaciones diferentes .
sleske
2

sí, pruébalo aquí.

http://www.jsonlint.com/

y poner [{}]

hvgotcodes
fuente
3
Es incluso más fácil que eso. Ponlo []y se validará.
Sorigal
El enlace está inactivo, actualice o elimine esta respuesta (casi solo de enlace).
Anthon
1

Hay cierta confusión, como se ve en los otros comentarios. El tipo de medio "application / json" solo permite objetos o matrices en el nivel superior para texto JSON , según JSON RFC . Sin embargo, para un analizador, cualquier valor JSON es aceptable, como se ve en la especificación ECMAScript.

cdunn2001
fuente
Cualquier valor JSON como elemento de nivel superior es aceptable para un analizador ECMAScript , pero no para un analizador JSON (compatible) : distinción importante.
sleske
Esa es una distinción interesante, pero no entiendo lo que estás diciendo. ¿Cuál es la definición de un "analizador JSON (compatible)"?
cdunn2001
1
Bueno, un analizador JSON es un analizador de la gramática JSON. Si bien JSON se parece a Javascript, es una gramática diferente (mucho más simple). Consulte tools.ietf.org/html/rfc7159 , que describe la gramática JSON. "compatible" solo significa que el analizador en realidad sigue la gramática (lo que debería hacer cualquier analizador decente).
sleske
3
RFC 4627 está desactualizado, no lo siga más. El nuevo RFC permite también valores simples en el nivel superior.
Matthias Dieter Wallnöfer