¿Cuál es la diferencia entre JSON y notación literal de objetos?

Resuelto pencilCake asked hace 14 años • 10 respuestas

¿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?

pencilCake avatar May 25 '10 18:05 pencilCake
Aceptado

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:

  1. Tus claves no son cadenas (literales). Son nombres identificadores .
  2. 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" .

Felix Kling avatar May 25 '2010 11:05 Felix Kling

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)
Quentin avatar May 25 '2010 11:05 Quentin

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)

Nick Perkins avatar Dec 14 '2011 15:12 Nick Perkins

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.

ma11hew28 avatar Feb 16 '2011 03:02 ma11hew28