¿Cuál es la diferencia entre JSON y notación literal de objetos?
¿Alguien puede decirme cuál es la principal diferencia entre un objeto JavaScript definido mediante notación literal de objeto y un objeto JSON ?
Según un libro de JavaScript, dice que este es un objeto definido mediante la notación de objetos :
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
¿Por qué no es un objeto JSON en este caso? ¿Solo porque no está definido entre comillas?
Primero aclaremos qué es realmente JSON . JSON es un formato de intercambio de datos textual e independiente del idioma, muy parecido a XML, CSV o YAML.
Los datos se pueden almacenar de muchas maneras, pero si deben almacenarse en un archivo de texto y ser legibles por una computadora, deben seguir alguna estructura. JSON es uno de los muchos formatos que definen dicha estructura.
Estos formatos suelen ser independientes del lenguaje, lo que significa que pueden ser procesados por Java, Python, JavaScript, PHP, lo que sea.
Por el contrario, JavaScript es un lenguaje de programación. Por supuesto, JavaScript también proporciona una forma de definir/describir datos, pero la sintaxis es muy específica de JavaScript.
Como contraejemplo, Python tiene el concepto de tuplas , su sintaxis es (x, y)
. JavaScript no tiene algo como esto.
Veamos las diferencias sintácticas entre los literales de objetos JSON y JavaScript.
JSON tiene las siguientes restricciones sintácticas:
- Las claves de objeto deben ser cadenas (es decir, una secuencia de caracteres entre comillas dobles
"
). - Los valores pueden ser:
- una cuerda
- un número
- un objeto (JSON)
- una matriz
true
false
null
- Las claves duplicadas (
{"foo":"bar","foo":"baz"}
) producen resultados indefinidos y específicos de la implementación; la especificación JSON no define específicamente su semántica
En JavaScript, los objetos literales pueden tener
- Literales de cadena, literales numéricos o nombres de identificadores como claves (desde ES6, ahora también se pueden calcular claves, lo que introduce otra sintaxis más).
- Los valores pueden ser cualquier expresión JavaScript válida, incluidas definiciones de funciones y archivos
undefined
. - Las claves duplicadas producen resultados definidos y especificados (en modo flexible, la última definición reemplaza a la anterior; en modo estricto, es un error).
Sabiendo que, con solo mirar la sintaxis , tu ejemplo no es JSON por dos razones:
- Tus claves no son cadenas (literales). Son nombres identificadores .
- No puede asignar una función como valor a un "objeto JSON" (porque JSON no define ninguna sintaxis para funciones).
Pero lo más importante, para repetir mi explicación desde el principio: estás en un contexto de JavaScript. Usted define un objeto JavaScript. Si lo hay, un "objeto JSON" sólo puede estar contenido en una cadena:
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing JSON
Es decir, si estás escribiendo código fuente JavaScript y no estás tratando con una cadena , no estás tratando con JSON. Tal vez recibió los datos como JSON (por ejemplo, a través de ajax o leyendo de un archivo), pero una vez que usted o la biblioteca que está utilizando los haya analizado, ya no será JSON.
El hecho de que los literales de objetos y JSON sean similares no significa que pueda nombrarlos indistintamente. Consulte también No existe el "objeto JSON" .
JSON tiene una sintaxis mucho más limitada que incluye:
- Los valores clave deben citarse
- Las cadenas deben ir entre comillas
"
y no'
- Tiene un rango de valores más limitado (por ejemplo, no se permiten funciones)
Realmente no existe un "objeto JSON".
La especificación JSON es una sintaxis para codificar datos como una cadena. Lo que la gente llama un "objeto JSON" (en javascript) es en realidad solo un objeto javascript ordinario que (probablemente) ha sido deserialado de una cadena JSON válida y que se puede volver a serializar fácilmente como una cadena JSON válida. Esto generalmente significa que contiene solo datos (y no funciones). También significa que no hay fechas, porque JSON no tiene un tipo de fecha (probablemente lo más doloroso de JSON;)
Además, (despotricar...) cuando la gente habla de un "objeto JSON", casi siempre se refiere a datos que tienen las "llaves" en el nivel superior. Esto corresponde muy bien a un objeto javascript. Sin embargo, la especificación JSON no requiere que haya un único objeto "llaves" en el nivel superior de una cadena JSON. Es JSON perfectamente válido tener una lista en el nivel superior, o incluso tener un solo valor. Entonces, si bien cada "Objeto JSON" corresponde a un JSON válido, no todas las cadenas JSON válidas corresponden a lo que llamaríamos un "Objeto JSON". (porque la cadena podría representar una lista o un valor atómico)
Según JSON en JavaScript ,
JSON es un subconjunto de la notación literal de objetos de JavaScript.
En otras palabras, JSON válido también es una notación literal de objeto JavaScript válida, pero no necesariamente al revés.
Además de leer la documentación , como sugirió @Filix King, también sugiero jugar con el validador JSON en línea JSONLint . Así aprendí que las claves de los objetos JSON deben ser cadenas.