2009-04-29 25 views
25

Recientemente escuché sobre JSON (JavaScript Object Notation). ¿Alguien puede explicar por qué es considerado (por algunos sitios web/blogs/etc.) como importante? Ya tenemos XML, ¿por qué es mejor JSON (aparte de ser "nativo de Javascript")?¿Por qué es importante JSON?

Editar: Hmm, el tema de la respuesta principal parece ser 'es más pequeño'. Sin embargo, el hecho de que permite la obtención de datos entre dominios me parece importante. ¿O es esto en la práctica no (todavía) muy utilizado?

+8

oí que iban a cambiar el nombre de XML para OEML (Over Engineered Markup Language) –

+2

¿Cómo maneja JSON diferentes codificaciones de caracteres (como lo hace XML). ¿Hay una codificación de caracteres implícita en una representación JSON? –

+1

Permitir que los datos sean extraídos de otro dominio no es realmente una característica inherente a los formatos XML o JSON * *. Es algo relacionado con el navegador. –

Respuesta

0

No es que sea mejor, pero que puede unir muchas cosas para permitir una transferencia de datos perfecta sin un análisis manual.

Por ejemplo Javascript -> C# servicio web -> JavaScript

+0

No creo que eso cuente como argumento, ya que incluso en JavaScript a menudo el JSON no se evalúa, sino que se analiza por razones de seguridad. –

+0

@Benedikt Eger - Hay un nuevo reemplazo para eval coming que evaluará JSON sin los riesgos de eval. Además, si el JSON proviene de una fuente confiable, normalmente será evaluado. – stevehipwell

13

JSON es generalmente mucho menor que su equivalente XML. Una transferencia más pequeña significa una transferencia más rápida, lo que se traduce en una mejor experiencia del usuario.

+0

No estoy de acuerdo con que json sea más pequeño. '' es el formato XML compacto. 44 caracteres. El json compacto es: '{person: {" name ":" John Doe "," tag ": [" amigo "," varón "]}}' 52 caracteres. Hay un 25% de diferencia, a favor de XML. XML * puede * ser más grande, pero no es necesario que sea así. – Cheeso

+4

Estoy de acuerdo, de ahí mi uso de la palabra "en general". Una vez que tiene matrices de elementos complejos, XML se vuelve más grande que JSON. Seguramente su mala interpretación de la palabra "en general" no vale la pena un voto a la baja? –

+1

Su JSON compacto es incorrecto, debería ser '{" name ":" John Doe "," tag ": [" amigo "," varón "]}'. Esto lo convierte en 45 caracteres, que aún es más grande que el XML, pero solo en 1 carácter. –

4
+0

Desde el segundo enlace "Si los datos están formateados como XML, Ajax se limita a buscar datos del mismo dominio (sitio web) de donde proviene la aplicación Ajax. Si los datos están formateados como JSON, Ajax puede viajar a través de dominios" Eso no está bien, ¿verdad? –

+0

Brian, creo que tienes razón. Sugerir el segundo enlace se trata como sospechoso; parece responder a la pregunta en su misión, aunque no lo logre en algunos lugares. –

+0

@Sam. Lo suficientemente justo. Gracias. –

19

XML tiene varios inconvenientes:

  • Es pesado!
  • Proporciona una representación jerárquica del contenido que no es exactamente el mismo (pero es bastante similar a) el modelo de objetos Javascript.
  • Javascript está disponible en todas partes. Sin ningún analizador externo, puede procesar JSON directamente con el intérprete JS.

Está claro que no está destinado a reemplazar completamente XML. Para las aplicaciones web basadas en JS, sus ventajas pueden ser útiles.

+1

¿Qué quiere decir con "Javascript está disponible en todas partes"? Si conecto mi aplicación Java a una instancia de CouchDb, tengo analizadores XML disponibles de forma nativa, pero no hay ningún analizador de Javascript. –

+1

En todas partes en este sentido significa "en cada computadora (con un navegador moderno)". –

+0

@Rabarberski: Ser el mismo modelo de objeto exacto también es una gran ventaja que a veces puede estar infravalorada. –

12

JSON es mucho más conciso. XML:

<person> 
    <name>John Doe</name> 
    <tags> 
     <tag>friend</tag> 
     <tag>male</tag> 
    </tags> 
</person> 

JSON:

{"name": "John Doe", "tags": ["friend", "male"]} 

Hay menos funciones superpuestas, también. Por ejemplo, en XML hay tensión entre elegir usar elementos (como arriba), versus atributos (<person name="John Doe">).

+9

De hecho, encuentro XML mucho más fácil de leer. –

+0

Ignorando el espacio en blanco extraño, eso es aproximadamente 44 caracteres frente a 78, pero tenga en cuenta que cualquier elemento individual como el nombre puede ser reemplazado por un atributo (guardando otros 7 o más caracteres). – cletus

+4

@Steve, ¿desde cuándo era importante la legibilidad en los formatos de intercambio de datos? – James

1

JSON es una forma de serializar datos en objetos JavaScript. La sintaxis está tomada del lenguaje, por lo que debe ser familiar para el desarrollador que trata con Javascript, y - como la cadena de un objeto - es un método de serialización más natural para la interacción dentro del navegador que un derivado XML de pleno derecho (con todas las decisiones de diseño arbitrarias que implica).

Es ligero e intuitivo.

11

JSON se volvió de uso popular principalmente porque ofrece una forma de eludir la política del mismo origen utilizada en los navegadores web y, por lo tanto, permite los mashups.

Digamos que está escribiendo un servicio web en el dominio A.No puede cargar datos XML del dominio B y analizarlos porque la única forma de hacerlo sería XMLHttpRequest, y XMLHttpRequest estuvo originalmente limitado por la misma política de origen para hablar solo con URL en el mismo dominio que la página que lo contiene.

Resulta que para una variedad de razones, que está les permita solicitar < guión > etiquetas través orígenes. Las personas inteligentes se dieron cuenta de que esta era una buena forma de evitar la limitación con XMLHttpRequest. En lugar de que el servidor devuelva XML, puede devolver una serie de objetos de JavaScript y literales de matriz.

(pregunta extra se deja como ejercicio para el lector: ¿por qué es < script src = "..." > permitido a través de dominios sin servidor de opt-in, pero no es XHR)

Por supuesto, volviendo una secuencia de comandos < > que consiste en nada más que literales de objeto no es útil porque sin asignar los valores a alguna variable, no puede hacer nada con ella. Por lo tanto, la mayoría de los servicios utilizan una variante de JSON, llamada JSONP (http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/).

Con el aumento de la popularidad de los mashups, las personas se dieron cuenta de que JSON era un formato conveniente de intercambio de datos en general, especialmente cuando JavaScript está en un extremo del canal. Por ejemplo, JSON se usa ampliamente en Chromium, incluso en casos donde C++ está en ambos lados. Es una forma sencilla y ligera de representar datos simples, que existen buenos analizadores en muchos idiomas.

De manera divertida, el uso de <script> etiquetas para hacer mashups es increíblemente inseguro porque es esencialmente XSS a propósito. Por lo tanto, se tuvo que introducir JSON nativo (http://ejohn.org/blog/native-json-support-is-required/), lo que evita los beneficios originales del formato. Pero en ese momento, ya era súper popular :)

+0

No entiendo esta historia de origen. Es trivial escribir una función de JavaScript que devuelve un documento XML (sin analizar). Puede utilizar este truco para proporcionar XML tan fácilmente como usarlo para proporcionar un formato de serialización completamente nuevo. –

+0

Es verdad, podría devolver una cadena de XML y luego analizarlo. Pero la cadena debería escaparse cuidadosamente dentro de una cadena de JavaScript. Las personas se encontraron generando dinámicamente: returnData ("< data foo = \" bar \ "> ...</foo > ") ... y se preguntan por qué molestarse cuando sólo se podían devolver los objetos y las matrices directamente. Y una vez que vaya por ese camino, se da cuenta de que el trabajo con los objetos nativos y matrices con ninguna fase de análisis por separado es una mejor idea en general. Pero creo que los mashups son cómo comenzó JSON, o al menos uno de los dos motivos principales. –

2

Depende de lo que va a hacer. Aquí hay muchas respuestas que prefieren JSON sobre XML. Si miras más profundamente, no hay una gran diferencia.

Si tiene un árbol de objetos, solo obtiene el árbol de objetos javascript. Si echas un vistazo a la tensión para utilizar el acceso de estilo OOP que vuelve a encenderlo. Supongamos que tiene un objeto de tipo A, B, C que está construido en un árbol. Puede habilitarlos fácilmente para ser serializados a JSON. Si los vuelve a leer, solo obtendrá un árbol de objetos javascript. Para reconstruir tu A, B, C tienes que rellenar los valores manualmente en objetos creados manualmente o haces algunos hacks. ¿Suena como analizar XML y crear objetos? Bueno, sí :)

Actualmente, los navegadores más nuevos vienen con soporte nativo para JSON. Para admitir más buscadores, tiene dos opciones: a) carga un json paraser en JavaScript que lo ayuda a analizar. Entonces, ¿qué tan gordo suena esto con respecto a la libertinaje? La otra opción como a menudo veo es eval. Puede hacer eval() en una cadena JSON para obtener los objetos. Pero eso introduce un nuevo conjunto de problemas de seguridad. JSON se especifica por lo que no puede contener funciones. Si no está comprobando la función de los objetos, alguien puede enviarle fácilmente el código que se está ejecutando.

Por lo que puede depender de lo que más te guste: JSON o XML. La mayor diferencia es, efectivamente, la forma de acceder a las cosas, ya sean las etiquetas de script XMLHTTPRequest ... Yo decidiría sobre esto qué usar. En mi opinión, si hubiera un soporte adecuado para XPATH en los navegadores, a menudo decidiría si usar XML. Pero la moda está dirigida hacia json y cargando analizadores json adicionales en javascript.

Si no puede decidirse y sabe que necesita algo realmente poderoso, debe echarle un vistazo a YAML. Leer sobre YAML es muy interesante para obtener más información sobre el tema. Pero realmente depende de lo que estás tratando de hacer.

1

JSON es un formato de serialización de objetos basado en texto que es más liviano que XML y que se integra directamente con el modelo de objetos de JavaScript. Esa es la mayoría de sus ventajas allí.

Sus desventajas (en comparación con XML) son, aproximadamente: menos herramientas disponibles (olvidarse de la validación y/o transformación estándar, para no mencionar el resaltado de sintaxis o la buena formación en la mayoría de los editores), menos probabilidades de ser humano legible (hay grandes variaciones en la legibilidad de JSON y XML, por lo que es una afirmación necesariamente difusa), la estrecha integración con JavaScript hace que la integración no sea tan estrecha con otros entornos.

5

Si está trabajando en Javascript, es mucho más fácil para nosotros JSON. Esto se debe a que JSON se puede evaluar directamente en un objeto Javascript, que es mucho más fácil de trabajar que el DOM.

endeudamiento y alterando ligeramente el XML y JSON desde arriba

XML: 

<person> 
    <name>John Doe</name> 
    <tag>friend</tag> 
    <tag>male</tag> 
</person> 

JSON: 

{ person: {"name": "John Doe", "tag": ["friend", "male"]} } 

Si quería conseguir el segundo objeto de la etiqueta con XML, que había necesidad de utilizar las potentes pero detallados API DOM:

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1]; 

Mientras que con un objeto Javascript que entró a través de JSON, simplemente podría utilizar:

var tag2=jsonObj.person.tag[1]; 

Por supuesto, jQuery hace que el ejemplo DOM mucho más simple:

var tag2=$("person tag",xmlObj).get(1); 

Sin embargo, sólo JSON "encaja" en un mundo Javascript. Si trabajas con él por un tiempo, descubrirás que tienes mucha menos carga mental que involucrar datos basados ​​en XML.

Todos los ejemplos anteriores ignoran la posibilidad de que uno o más nodos estén disponibles, estén duplicados o la posibilidad de que el nodo tenga solo uno o ninguno. Sin embargo, para ilustrar el nativo-dad de JSON, para hacer esto con la jsonObj, usted sólo tiene que:

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null); 

(algunas personas no les guste ese largo del ternario, pero funciona). Pero XML sería (en mi opinión) más desagradable (no creo que te interese el enfoque ternario porque seguirías llamando a los métodos dom que pueden tener que volver a hacer el trabajo según la implementación):

var tag2=null; 
var persons=xmlObj.getElementsByTagName("person"); 
if(persons.length==1) { 
    var tags=persons[0].getElementsByTagName("tag"); 
    if(tags.length==2) { tag2=tags[1]; } 
} 

Jquery (no probado):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0); 
Cuestiones relacionadas