¿Alguien puede decirme cuál es la principal diferencia entre un objeto JavaScript definido mediante el uso de la notación literal de objetos y el 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 se define mediante comillas?
javascript
json
object-notation
lápiz de pastel
fuente
fuente
Respuestas:
Primero aclaremos qué es JSON en realidad. JSON es un formato de intercambio de datos textual e independiente del idioma, muy parecido a XML, CSV o YAML.
Los datos pueden almacenarse 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.
Tales formatos son típicamente 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:
"
).true
false
null
{"foo":"bar","foo":"baz"}
) producen resultados indefinidos específicos de la implementación; la especificación JSON específicamente no define su semánticaEn JavaScript, los literales de objeto pueden tener
undefined
.Sabiendo que, simplemente mirando la sintaxis , su ejemplo no es JSON debido a dos razones:
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 hay alguno, un "objeto JSON" solo puede estar contenido en una cadena:
Es decir, si está escribiendo código fuente JavaScript y no está tratando con una cadena , no está tratando con JSON. Tal vez recibió los datos como JSON (por ejemplo, a través de ajax o leyendo un archivo), pero una vez que usted o la biblioteca que está utilizando lo ha analizado, ya no es JSON.
Sólo porque literales de objetos y JSON se ven similares , que no quiere decir que usted puede nombrar indistintamente. Consulte también No existe tal cosa como un "Objeto JSON" .
fuente
JSON tiene una sintaxis mucho más limitada que incluye:
"
y no'
fuente
Realmente no existe tal cosa como 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 un objeto javascript ordinario que (probablemente) se ha deserializado de una cadena JSON válida, y 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, cuando se habla de un "Objeto JSON", casi siempre se refieren a datos que tienen "llaves" en el nivel superior. Esto corresponde muy bien a un objeto javascript. Sin embargo, la especificación JSON no requiere que haya un solo objeto "llaves" en el nivel superior de una cadena JSON. Es perfectamente válido JSON 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)
fuente
JSON-text = object / array
.De acuerdo con JSON en JavaScript ,
En otras palabras, JSON válido también es notación literal de objeto JavaScript válido, 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í es como aprendí que las claves de los objetos JSON deben ser cadenas.
fuente
🔫 JSON : la alternativa libre de grasa a XML
JSON ha sido ampliamente adoptado por personas que descubrieron que facilitaba mucho la producción de aplicaciones y servicios distribuidos. El tipo de medio oficial de Internet para JSON es
application/json
RFC 4627
. Los nombres de archivo JSON usan la extensión.json
.► JavaScript Object Notation (
JSON
) es un formato de intercambio de datos ligero, basado en texto e independiente del idioma. JSON se ha utilizado para intercambiar datos entre aplicaciones escritas en cualquier lenguaje de programación.JSON es un subconjunto de JavaScript. Javascript se deriva del estándar de lenguaje de programación ECMAScript.
► ECMAScript
ECMAScript se ha convertido en uno de los lenguajes de programación de propósito general más utilizados en el mundo. Es mejor conocido como el lenguaje integrado en los navegadores web, pero también se ha adoptado ampliamente para servidores y aplicaciones integradas. ECMAScript se basa en varias tecnologías de origen, el ser más conocido
JavaScript
(Netscape Communications)) yJScript
(Microsoft Corporation) . Aunque antes de 1994, ECMA era conocida como "Asociación Europea de Fabricantes de Computadoras", después de 1994, cuando la organización se volvió global, la "marca registrada" "Ecma" se mantuvo por razones históricas.ECMAScript es el lenguaje, mientras que JavaScript, JScript e incluso ActionScript se llaman
"Dialects"
.Información sobre el navegador y la computadora de sus usuarios.
ECMAScript es el lenguaje de script que forma la base de JavaScript. .
JavaScript
language resources
ECMA-262
Links
Initial Edition, June 1997
PDF.
2nd Edition, August 1998
PDF.
3rd Edition, December 1999
PDF.
5th Edition, December 2009
PDF.
5.1 Edition, June 2011
HTML.
6th Edition, June 2015
HTML.
7ᵗʰ Edition, June 2016
HTML.
8th edition, June 2017
HTML.
9th Edition, 2018
HTML.
NOTA «La cuarta edición de ECMAScript no se publicó porque el trabajo estaba incompleto .
► Los valores de las claves deben estar entre comillas, solo se permiten cadenas para las claves. Si usa otro que no sea String, se convertirá en String. Pero no se recomienda usar otras teclas que no sean String. Mira un ejemplo como este -
{ 'key':'val' }
overRFC 4627 - jsonformatter
► Las cadenas JSON se deben citar con "y no '. Una cadena es muy parecida a una cadena C o Java. Las cadenas deben estar entre comillas dobles.
Los accesores de propiedades de objeto proporcionan acceso a las propiedades de un objeto mediante la notación de puntos o la notación de corchetes.
► Tiene un rango de valores más limitado (por ejemplo, no se permiten funciones). Un valor puede ser una cadena entre comillas dobles, número, booleano, nulo, objeto o matriz. Estas estructuras pueden estar anidadas.
►
JavaScript
es la implementación más popular del Estándar ECMAScript. Las características principales de Javascript se basan en el estándar ECMAScript, pero Javascript también tiene otras características adicionales que no están en las especificaciones / estándar de ECMA. Cada navegador tiene un intérprete de JavaScript.JavaScript es un lenguaje de tipo dinámico. Eso significa que no tiene que especificar el tipo de datos de una variable cuando la declara, y los tipos de datos se convierten automáticamente según sea necesario durante la ejecución del script.
Literals
:Object literals
RFC 7159
Una estructura de objeto se representa como un par de llaves entre cero o más pares de nombre / valor (o miembros). Un nombre es una cadena. Después de cada nombre, aparecen dos puntos, que separan el nombre del valor. Una coma simple separa un valor del siguiente nombre. Los nombres dentro de un objeto DEBEN ser únicos.
ECMAScript admite herencia basada en prototipos. Cada constructor tiene un prototipo asociado, y cada objeto creado por ese constructor tiene una referencia implícita al prototipo (llamado prototipo del objeto) asociado con su constructor. Además, un prototipo puede tener una referencia implícita no nula a su prototipo, y así sucesivamente; Esto se llama la cadena prototipo.
En un lenguaje orientado a objetos basado en clases, en general, el estado es llevado por instancias, los métodos son llevados por clases, y la herencia es solo de estructura y comportamiento. En ECMAScript, el estado y los métodos son transportados por objetos, y la estructura, el comportamiento y el estado son todos heredados.
Un prototipo es un objeto utilizado para implementar la herencia de estructura, estado y comportamiento en ECMAScript. Cuando un constructor crea un objeto, ese objeto hace referencia implícita al prototipo asociado del constructor con el fin de resolver referencias de propiedad. El prototipo asociado al constructor puede ser referenciado por la expresión del programa constructor.prototype, y las propiedades agregadas al prototipo de un objeto son compartidas, a través de la herencia, por todos los objetos que comparten el prototipo.
fuente
Para aquellos que todavía piensan que los RFC son más importantes que los blogs y los conceptos erróneos basados en la opinión, tratemos de responder aclarando algunos puntos. No voy a repetir todas las diferencias correctas ya mencionadas en respuestas anteriores, aquí solo estoy tratando de agregar valor resumiendo alguna parte crucial rfc7159
Extractos de https://tools.ietf.org/html/rfc7159
Ejemplos (de la página 12 de RFC)
Este es un objeto JSON:
Su miembro Image es un objeto cuyo miembro Thumbnail es un objeto y cuyo miembro ID es una matriz de números.
De Verdad?
fuente
Object
, es unString
. GraciasPor lo que yo entiendo, la principal diferencia es la flexibilidad .
JSON es un tipo de contenedor en "JavaScript Object Notation" que obliga a los usuarios a obedecer reglas más estrictas para definir los objetos. Y lo hace limitando las posibles formas de declaración de objetos proporcionadas por la función de notación de objetos JavaScript.
Como resultado, tenemos objetos más simples y estandarizados que se adaptan mejor al intercambio de datos entre plataformas.
Básicamente, el nuevo objeto en mi ejemplo anterior es un objeto definido usando la notación de objeto de JavaScript; pero no es un objeto JSON 'válido' porque no sigue las reglas que requieren los estándares JSON.
Este enlace también es bastante útil: http://msdn.microsoft.com/en-us/library/bb299886.aspx
fuente
Primero debes saber qué es JSON:
Es un formato de intercambio de datos independiente del lenguaje. La sintaxis de JSON se inspiró en la notación literal de objetos de JavaScript, pero existen diferencias entre ellos.
Por ejemplo, en JSON se deben citar todas las claves, mientras que en los literales de objetos esto no es necesario:
// JSON: {"foo": "bar"}
// Objeto literal: var o = {foo: "bar"}; Las comillas son obligatorias en JSON porque en JavaScript (más exactamente en ECMAScript 3rd. Edition), el uso de palabras reservadas como nombres de propiedades no está permitido, por ejemplo:
var o = {if: "foo"}; // SyntaxError en ES3 Mientras, usar un literal de cadena como nombre de propiedad (citando el nombre de la propiedad) no da problemas:
var o = {"if": "foo"}; Entonces, para "compatibilidad" (¿y evaluación fácil, tal vez?), Las citas son obligatorias.
Los tipos de datos en JSON también están restringidos a los siguientes valores:
número de cadena matriz de objetos Un literal como: verdadero falso nulo La gramática de las cadenas cambia. Deben estar delimitados por comillas dobles, mientras que en JavaScript, puede usar comillas simples o dobles indistintamente.
// JSON no válido: {"foo": 'bar'} La gramática aceptada de Números de JSON también cambia, en JavaScript puedes usar Literales hexadecimales, por ejemplo 0xFF, o (los infames) Literales Octales, por ejemplo 010. En JSON puedes usar solo literales decimales.
// JSON no válido: {"foo": 0xFF}
fuente
Javascript Object Literal vs JSON:
JSON
lenguaje, que significa 'notación de objeto Javascript', tiene su sintaxis derivada de la sintaxis literal del objeto javascript. Se utiliza como un lenguaje de programación independiente del formato de transferencia de datos textuales.Ejemplo:
Notación de objeto JS, utilizada en JS para crear objetos en el código convenientemente:
Ejemplo de JSON:
Principales diferencias:
Todas las claves de objeto en JSON deben ser cadenas. En Javascript las claves de objeto pueden ser cadenas o números
Todas las cadenas en JSON se deben citar en "comillas dobles". Mientras que en Javascript se permiten tanto comillas simples como comillas dobles. Incluso sin comillas en la notación de objetos Javascript, las claves de los objetos se convierten implícitamente en cadenas.
En JSON, una función no se puede definir como un valor de un objeto (ya que esto es específico de Javascript). En Javascript esto es completamente legal.
Javascript construir en
JSON
objeto:JSON
los objetos se pueden convertir fácilmente a Javascript y viceversa utilizando elJSON
objeto incorporado que Javascript ofrece en su tiempo de ejecución. Por ejemplo:fuente
Aquí hay una sorprendente diferencia: no se puede usar
undefined
en json y todos los campos de objetos con valores indefinidos desaparecerán despuésJSON.stringify
🙈🙉🙊
fuente