Objeto JavaScript frente a JSON
Quiero entender claramente las diferencias básicas entre el objeto JavaScript y la cadena JSON.
Digamos que creo la siguiente variable de JavaScript:
var testObject = {one: 1,"two":2,"three":3};
Pregunta 1. ¿La clave/nombre de propiedad es válida tanto con como sin comillas? (p.ej,"one" : 1
)
En caso afirmativo, ¿cuál es la diferencia?
Pregunta 2: Si convierto el objeto anterior usandoJSON.stringify(testObject)
, ¿cuál es la diferencia entre el objeto JavaScript original y el JSON?
Siento que son casi iguales. Por favor explique esto.
Pregunta 3: Para analizar una cadena JSON, ¿se recomienda el método siguiente?
var javascriptObj = JSON.parse(jSonString);
- ¿La clave/nombre de propiedad es válida tanto con como sin comillas?
La única vez que necesita encerrar una clave entre comillas cuando utiliza la notación literal de objeto es cuando la clave es una palabra reservada o contiene un carácter especial ( if
,,, etc.). Vale la pena señalar que una clave en JSON debe estar entre comillas dobles .:
-
- Si convierto el objeto anterior a JSON usando
var jSonString = JSON.stringify(testObject);
, ¿cuál es la diferencia entre los dos (JavaScript obj y JSON)?
JSON es un formato de intercambio de datos. Es un estándar que describe cómo se pueden representar en una cadena listas ordenadas y mapas, cadenas, valores booleanos y números desordenados. Al igual que XML y YAML son una forma de pasar información estructurada entre idiomas, JSON es lo mismo. Por otro lado, un objeto JavaScript es un tipo físico. Al igual que una matriz PHP, una clase/estructura C++, un objeto JavaScript es un tipo interno de JavaScript.
Aquí hay una historia. Imaginemos que ha comprado algunos muebles en una tienda y desea que se los entreguen. Sin embargo, el único que queda en stock es el modelo de exhibición, pero aceptas comprarlo.
En la tienda, la cómoda que has comprado es un objeto vivo:
var chestOfDrawers = {
color: "red",
numberOfDrawers: 4
}
Sin embargo, no puedes enviar una cómoda por correo, así que la desmontas (léela, encadena). Ahora es inútil en términos de muebles. Ahora es JSON. Está en forma de paquete plano.
{"color":"red","numberOfDrawers":4}
Cuando lo recibes, reconstruyes la cómoda (léelo, analízalo). Ahora ha vuelto a tener forma de objeto.
La razón detrás de JSON, XML y YAML es permitir que los datos se transfieran entre lenguajes de programación en un formato que ambos lenguajes participantes puedan entender; no puedes darle PHP o C++ tu objeto JavaScript directamente; porque cada idioma representa un objeto de manera diferente bajo el capó. Sin embargo, debido a que hemos codificado el objeto en notación JSON; es decir, una forma estandarizada de representar datos, podemos transmitir la representación JSON del objeto a otro lenguaje (C++, PHP), ellos pueden recrear el objeto JavaScript que teníamos en su propio objeto basado en la representación JSON del objeto.
Es importante tener en cuenta que JSON no puede representar funciones ni fechas. Si intenta encadenar un objeto con un miembro de función, la función se omitirá de la representación JSON. Una fecha se convertirá en una cadena;
JSON.stringify({
foo: new Date(),
blah: function () {
alert('hello');
}
}); // Returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
- Para analizar una cadena JSON, ¿se recomienda el método siguiente?
var javascriptObj = JSON.parse(jSonString);
Sí, pero los navegadores más antiguos no admiten JSON de forma nativa (antes de Internet Explorer 8) . Para respaldarlos, debe incluirjson2.js
.
Si está usando jQuery, puede llamar a jQuery.parseJSON()
, que se usará JSON.parse()
de forma interna si es compatible y, de lo contrario, recurrirá a una implementación personalizada para analizar la entrada.
Pregunta 1: Al definir literales de objetos en JavaScript, las claves pueden incluir comillas o no. No hay diferencia excepto que las comillas le permiten especificar ciertas claves que harían que el intérprete no pudiera analizarlas si las probara desnudas. Por ejemplo, si quisieras una clave que fuera solo un signo de exclamación, necesitarías comillas:
a = { "!": 1234 } // Valid
a = { !: 1234 } // Syntax error
Sin embargo, en la mayoría de los casos, puede omitir las comillas alrededor de las claves en los literales de objetos.
Pregunta 2: JSON es literalmente una representación de cadena. Es sólo una cuerda. Entonces, considere esto:
var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);
Como testObject
es un objeto real, puedes llamar a sus propiedades y hacer cualquier otra cosa que puedas hacer con los objetos:
testObject.hello => "world"
Por otro lado, jsonString
es sólo una cadena:
jsonString.hello => undefined
Tenga en cuenta otra diferencia: en JSON, todas las claves deben estar entre comillas. Esto contrasta con los objetos literales, donde las comillas generalmente se pueden omitir según mi explicación en la pregunta 1.
Pregunta 3. Puede analizar una cadena JSON usando JSON.parse
y, en general, esta es la mejor manera de hacerlo (si el navegador o un marco lo proporciona). También puede usarlo simplemente eval
ya que JSON es un código JavaScript válido, pero se recomienda el método anterior por varias razones (eval tiene muchos problemas desagradables asociados).