He leído cuidadosamente la descripción de JSON http://json.org/ pero no estoy seguro de saber la respuesta a la simple pregunta. ¿Qué cadenas son el mínimo posible JSON válido?
"string"
¿es válida la cadena JSON?42
¿Es el número simple válido JSON?true
¿Es el valor booleano un JSON válido?{}
¿Es el objeto vacío un JSON válido?[]
¿Es la matriz vacía un JSON válido?
javascript
json
validation
bessarabov
fuente
fuente
Respuestas:
Al momento de escribir, JSON se describió únicamente en RFC4627 . Describe (al comienzo de "2") un texto JSON como un objeto o conjunto serializado.
Esto significa que solo
{}
y[]
son válidas, completar cadenas JSON en analizadores y stringifiers que cumplan con ese estándar.Sin embargo , la introducción de ECMA-404 cambia eso, y el consejo actualizado se puede leer aquí . También he escrito una publicación de blog sobre el tema.
Sin embargo, para confundir aún más el asunto, el
JSON
objeto (por ejemplo,JSON.parse()
yJSON.stringify()
) disponible en los navegadores web está estandarizado en ES5 , y eso define claramente los textos JSON aceptables de esta manera:Esto significaría que el objeto JSON acepta todos los valores JSON (incluidas las cadenas, los valores nulos y los números), aunque el objeto JSON se adhiera técnicamente a RFC 4627.
Tenga en cuenta que, por lo tanto, podría encadenar un número en un navegador conforme a través de
JSON.stringify(5)
, que sería rechazado por otro analizador que se adhiera a RFC4627, pero que no tenga la excepción específica mencionada anteriormente. Ruby, por ejemplo, parece ser uno de esos ejemplos que solo acepta objetos y matrices como raíz . PHP, por otro lado, agrega específicamente la excepción de que "también codificará y decodificará tipos escalares y NULL".fuente
true
,false
onull
solo es un texto JSON válido? ¿Podría por favor citar una fuente, ya que esto contradice la mayoría de las otras respuestas / comentarios aquí?Hay al menos cuatro documentos que pueden considerarse estándares JSON en Internet. Todos los RFC a los que se hace referencia describen el tipo mime
application/json
. Esto es lo que cada uno tiene que decir sobre los valores de nivel superior, y si se permite algo más que un objeto o una matriz en la parte superior:RFC-4627 : No.
Tenga en cuenta que RFC-4627 fue marcado como "informativo" en lugar de "estándar propuesto", y que está obsoleto por RFC-7159 , que a su vez está obsoleto por RFC-8259.
RFC-8259 : sí.
RFC-8259 está fechado en diciembre de 2017 y está marcado como "ESTÁNDAR DE INTERNET".
ECMA-262 : Sí.
ECMA-404 : sí.
fuente
De acuerdo con la definición anterior en RFC 4627 (que fue obsoleta en marzo de 2014 por RFC 7159), esos eran todos "valores JSON" válidos, pero solo los dos últimos constituirían un "texto JSON" completo:
Dependiendo del analizador utilizado, los "valores JSON" solitarios pueden ser aceptados de todos modos. Por ejemplo (apegarse a la terminología de "valor JSON" frente a "texto JSON"):
JSON.parse()
función ahora estandarizada en los navegadores modernos acepta cualquier "valor JSON"json_decode
se introdujo en la versión 5.2.0 solo aceptando un "texto JSON" completo, pero se modificó para aceptar cualquier "valor JSON" en la versión 5.2.1json.loads
acepta cualquier "valor JSON" de acuerdo con los ejemplos en esta página del manualLa distinción es un poco como la distinción entre un "documento XML" y un "fragmento XML", aunque técnicamente
<foo />
es un documento XML bien formado (sería mejor escribirlo<?xml version="1.0" ?><foo />
, pero como se señala en los comentarios, la<?xml
declaración es técnicamente opcional )fuente
<foo />
es un documento XML bien formado , pero no válido . (Pero lo mismo es cierto para<?xml version="1.0" ?><foo />
.)<foo />
puede o no ser válido contra un esquema particular , pero eso no es lo que ese estándar establece.La especificación ecma podría ser útil como referencia:
http://www.ecma-international.org/ecma-262/5.1/
fuente
JSON.parse
función se agregó luego a versiones posteriores del estándar ECMAScript basado en la gramática de Crockford y el RFC.JSON.parse("\"string\"");
JSON significa JavaScript Object Notation. Solo
{}
y[]
define un objeto Javascript. Los otros ejemplos son valores literales. Hay tipos de objetos en Javascript para trabajar con esos valores, pero la expresión"string"
es una representación del código fuente de un valor literal y no un objeto.Tenga en cuenta que JSON no es Javascript. Es una notación que representa datos. Tiene una estructura muy simple y limitada. Los datos JSON se estructuran con
{},:[]
caracteres. Solo puede usar valores literales dentro de esa estructura.Es perfectamente válido que un servidor responda con una descripción de objeto o un valor literal. Todos los analizadores JSON deben manejarse para manejar solo un valor literal, pero solo un valor. JSON solo puede representar un solo objeto a la vez. Entonces, para que un servidor devuelva más de un valor, debería estructurarlo como un objeto o una matriz.
fuente
Si si SI SI y si. Todos ellos son literales de valor JSON válidos.
Sin embargo, el RFC 4627 oficial establece:
Por lo tanto, un "archivo" completo debe consistir en un objeto o matriz como la estructura más externa, que por supuesto puede estar vacía. Sin embargo, muchos analizadores JSON aceptan valores primitivos también para la entrada.
fuente
Entonces su respuesta es la
"{}"
que denota un objeto vacío.fuente
undefined
, no "{}" `Simplemente siga los diagramas ferroviarios que figuran en la página json.org . [] y {} son los objetos JSON válidos mínimos posibles. Entonces la respuesta es [] y {}.
fuente
array
yobject
estaría en lo cierto, pero es razonable esperarvalue
que sea el comienzo.values
regla en su lugar (o además de) las reglasarray
yobject
, los números y las cadenas independientes son un documento JSON válido.[]
si bien un texto JSON válido según cada especificación que haya tenido una opinión al respecto, no es un "objeto JSON válido", ya que no es un objeto JSON. "Objeto" en JSON se refiere específicamente a la{}
notación; Las matrices JSON no son objetos JSON.