¿Cuál es la diferencia entre YAML y JSON? Cuándo preferir uno sobre el otro


¿Cuándo deberíamos preferir usar YAML sobre JSON y viceversa, considerando las siguientes cosas?

  • Rendimiento (tiempo de codificación/decodificación)
  • Consumo de memoria
  • Claridad de expresión
  • Disponibilidad de la biblioteca, facilidad de uso (prefiero C)

Estaba planeando usar uno de estos dos en nuestro sistema embebido para almacenar archivos de configuración.

Relacionado:

¿Debo usar YAML o JSON para almacenar mis datos de Perl?

 521
Author: Community, 2009-11-13

11 answers

Técnicamente YAML es un superconjunto de JSON. Esto significa que, al menos en teoría, un analizador YAML puede entender JSON, pero no necesariamente al revés.

Vea las especificaciones oficiales, en la sección titulada "YAML: Relation to JSON".

En general, hay ciertas cosas que me gustan de YAML que no están disponibles en JSON.

  • Como @jdupont señaló, YAML es visualmente más fácil de ver. De hecho, el YAML homepage es en sí mismo válido YAML, sin embargo, es fácil de leer para un humano.
  • YAML tiene la capacidad de hacer referencia a otros elementos dentro de un archivo YAML usando "anclas."Por lo tanto, puede manejar la información relacional como uno podría encontrar en una base de datos MySQL.
  • YAML es más robusto para incrustar otros formatos de serialización como JSON o XML dentro de un archivo YAML.

En la práctica, ninguno de estos dos últimos puntos probablemente importará para las cosas que usted o yo hacemos, pero a largo plazo, creo que YAML lo hará ser un formato de serialización de datos más robusto y viable.

En este momento, AJAX y otras tecnologías web tienden a usar JSON. YAML se está utilizando actualmente más para procesos de datos fuera de línea. Por ejemplo, está incluido de forma predeterminada en el paquete OpenCV computer vision basado en C, mientras que JSON no lo está.

Encontrará bibliotecas de C para JSON y YAML. Las bibliotecas de YAML tienden a ser más nuevas, pero no he tenido problemas con ellas en el pasado. Ver por ejemplo Yaml-cpp .

 518
Author: AndyL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-13 19:59:31

Diferencias:

  1. YAML, dependiendo de cómo lo uses, puede ser más legible que JSON
  2. JSON es a menudo más rápido y probablemente todavía es interoperable con más sistemas
  3. Es posible escribir un analizador JSON" suficientemente bueno " muy rápidamente
  4. Las claves duplicadas, que son potencialmenteJSON válidas, son definitivamente YAML no válido.
  5. YAML tiene un montón de características, incluyendo comentarios y anclajes relacionales. La sintaxis YAML es en consecuencia bastante complejo, y puede ser difícil de entender.
  6. Es posible escribir estructuras recursivas en yaml: {a: &b [*b]}, que se repetirán infinitamente en algunos convertidores. Incluso con la detección circular, una "bomba yaml" sigue siendo posible (ver xml bomb).
  7. Debido a que no hay referencias, es imposible serializar estructuras complejas con referencias a objetos en JSON. Por lo tanto, la serialización YAML puede ser más eficiente.
  8. En algunos entornos de codificación, el uso de YAML puede permitir un atacante a ejecutar código arbitrario.

Observaciones:

  1. Los programadores de Python son generalmente grandes fans de YAML, debido al uso de sangría, en lugar de sintaxis entre corchetes, para indicar niveles.
  2. Muchos programadores consideran que el apego de "significado" a la sangría es una mala elección.
  3. Si el formato de datos saldrá del entorno de una aplicación, se analizará dentro de una interfaz de usuario o se enviará en una capa de mensajería, JSON podría ser una mejor opción.
  4. YAML se puede usar, directamente, para tareas complejas como definiciones gramaticales, y a menudo es una mejor opción que inventar un nuevo lenguaje.
 130
Author: Erik Aronesty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-20 18:53:10

Evitando teoría esotérica

Esto responde al título, no a los detalles, ya que la mayoría acaba de leer el título de un resultado de búsqueda en Google como yo, así que sentí que era necesario explicar desde la perspectiva del desarrollador web.

  1. YAML usa sangría de espacios en blanco, que es un territorio familiar para los desarrolladores de Python.
  2. A los desarrolladores de JavaScript les encanta JSON porque es un subconjunto de JavaScript y se puede interpretar y escribir directamente dentro de JavaScript, junto con el uso de un forma abreviada de declarar JSON, que no requiere comillas dobles en las claves cuando se utilizan nombres de variables típicos sin espacios.
  3. Hay una gran cantidad de analizadores que funcionan muy bien en todos los idiomas tanto para YAML como para JSON.
  4. El formato de espacios en blanco de YAML puede ser mucho más fácil de ver en muchos casos porque el formato requiere un enfoque más legible por humanos.
  5. El espacio en blanco de YAML, aunque es más compacto y fácil de ver, puede ser engañosamente difícil de editar a mano si no tiene espacios en blanco visibles o indicadores de línea de sangría en su editor.
  6. JSON es mucho más rápido de serializar y deserializar debido a significativamente menos características que YAML para comprobar, lo que permite un código más pequeño y ligero para procesar JSON.
  7. Un error común es que YAML necesita menos puntuación y es más compacto que JSON, pero esto es completamente falso. El espacio en blanco es invisible, por lo que parece que hay menos caracteres, pero si cuenta el espacio en blanco real que es necesario estar allí para que YAML se interprete correctamente junto con la sangría adecuada, encontrará que YAML realmente requiere más caracteres que JSON. JSON no usa espacios en blanco para representar jerarquías o agrupaciones y se puede aplanar fácilmente eliminando espacios en blanco innecesarios para un transporte más compacto.

El elefante en la habitación: El Internet mismo

JavaScript domina tan claramente la web por un gran margen y los desarrolladores de JavaScript prefieren usar JSON como el el formato de datos abrumadoramente junto con las API web populares, por lo que se hace difícil argumentar el uso de YAML sobre JSON cuando se hace programación web en el sentido general, ya que es probable que sea superado en votos en un entorno de equipo. De hecho, la mayoría de los programadores web ni siquiera son conscientes de la existencia de YAML, y mucho menos considerar su uso.

Si está haciendo cualquier programación web, JSON es la forma predeterminada de hacerlo porque no se necesita ningún paso de traducción cuando se trabaja con JavaScript, por lo que debe idear una mejor argumento para usar YAML sobre JSON en ese caso.

 57
Author: Jason Sebring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-16 19:07:31

Esta pregunta tiene 6 años, pero extrañamente, ninguna de las respuestas realmente aborda los cuatro puntos (velocidad, memoria, expresividad, portabilidad).

Velocidad

Obviamente esto depende de la implementación, pero debido a que JSON es tan ampliamente utilizado y tan fácil de implementar, ha tendido a recibir mayor soporte nativo y, por lo tanto, velocidad. Teniendo en cuenta que YAML hace todo lo que hace JSON, más un camión más, es probable que de cualquier implementación comparable de ambos, el JSON uno será más rápido.

Sin embargo, dado que un archivo YAML puede ser ligeramente más pequeño que su contraparte JSON (debido a menos " y , caracteres), es posible que un analizador YAML altamente optimizado sea más rápido en circunstancias excepcionales.

Memoria

Básicamente se aplica el mismo argumento. Es difícil ver por qué un analizador YAML sería más eficiente en memoria que un analizador JSON, si están representando los mismos datos estructura.

Expresividad

Como han señalado otros, los programadores de Python tienden a preferir YAML, los programadores de JavaScript hacia JSON. Voy a hacer estas observaciones:

  • Es fácil memorizar toda la sintaxis de JSON, y por lo tanto estar muy seguro de entender el significado de cualquier archivo JSON. YAML no es realmente comprensible para ningún humano. El número de sutilezas y casos extremos es extremo.
  • Debido a que pocos analizadores implementan toda la especificación, es incluso es más difícil estar seguro sobre el significado de una expresión dada en un contexto dado.
  • La falta de comentarios en JSON es, en la práctica, un verdadero dolor.

Portabilidad

Es difícil imaginar un lenguaje moderno sin una biblioteca JSON. También es difícil imaginar un analizador JSON implementando algo menos que la especificación completa. YAML tiene un soporte generalizado, pero es menos ubicuo que JSON, y cada analizador implementa un subconjunto diferente. Por lo tanto, los archivos YAML son menos interoperables que podrías pensar.

Resumen

JSON es el ganador por rendimiento (si es relevante) e interoperabilidad. YAML es mejor para archivos mantenidos por humanos. HJSON es un compromiso decente aunque con una portabilidad muy reducida. JSON5 es un compromiso más razonable, con una sintaxis bien definida.

 23
Author: Steve Bennett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-31 03:44:16

Encuentro que YAML es más fácil para los ojos: menos paréntesis, "" etc. Aunque existe la molestia de las pestañas en YAML... pero uno consigue la caída de ella.

En términos de rendimiento/recursos, no esperaría grandes diferencias entre los dos.

Además, estamos hablando de archivos de configuración y, por lo tanto, no esperaría una alta frecuencia de actividad de codificación/decodificación, ¿no?

 20
Author: jldupont,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-13 02:46:45

Si no necesita ninguna característica que YAML tenga y JSON no, preferiría JSON porque es muy simple y está ampliamente soportado (tiene muchas bibliotecas en muchos idiomas). YAML es más complejo y tiene menos soporte. No creo que la velocidad de análisis o el uso de la memoria sea muy diferente, y tal vez no sea una gran parte del rendimiento de su programa.

 17
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-13 02:50:50

GIT y YAML

Las otras respuestas son buenas. Léelos primero. Pero añadiré otra razón para usar YAML a veces: git.

Cada vez más, muchos proyectos de programación utilizan repositorios git para la distribución y el archivo. Y, mientras que el historial de un repositorio git puede almacenar igualmente archivos JSON y YAML, el método "diff" utilizado para rastrear y mostrar los cambios en un archivo está orientado a la línea. Dado que YAML está obligado a estar orientado a la línea, cualquier pequeño cambio en un archivo YAML es más fácil de ver por un humano.

Es cierto, por supuesto, que los archivos JSON se pueden "hacer bonitos" ordenando las cadenas/claves y agregando sangría. Pero este no es el defecto y soy perezoso.

Personalmente, generalmente uso JSON para la interacción de sistema a sistema. A menudo uso YAML para archivos de configuración, archivos estáticos y archivos rastreados. (Generalmente también evito agregar anclajes relacionales YAML. La vida es demasiado corta para cazar bucles.)

Además, si la velocidad y el espacio son realmente una preocupación, no uso ninguno. Quizá quieras ver a BSON.

 11
Author: JohnAD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-23 19:41:20

Técnicamente YAML que ofrece mucho más que JSON (YAML v1.2 es un superconjunto de JSON):

  • comentarios
  • Anclas y herencia-ejemplo de 3 elementos idénticos:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
    
  • ...

La mayoría de las veces las personas no usarán esas características adicionales y la principal diferencia es que YAML usa sangría mientras que JSON usa corchetes. Esto hace YAML más conciso y legible (para el entrenado ojo).

Cuál elegir?

  • YAML las características adicionales y la notación concisa lo convierten en una buena opción para los archivos de configuración (archivos proporcionados por no usuarios).
  • JSONlas características limitadas, el amplio soporte y el análisis más rápido lo convierten en una gran opción para la interoperabilidad y los datos proporcionados por el usuario.
 8
Author: Wernight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-03 13:42:34

Dado que esta pregunta ahora ocupa un lugar destacado en la búsqueda de YAML y JSON, vale la pena señalar una diferencia rara vez citada entre los dos: licencia. JSON pretende tener una licencia a la que los usuarios de JSON deben adherirse (incluyendo la legalmente ambigua "se utilizará para el Bien, no para el Mal"). YAML no tiene tal reclamo de licencia, y eso podría ser una diferencia importante (para su abogado, si no para usted).

 3
Author: Mvr39,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-20 07:18:59

A veces no tienes que decidir por uno sobre el otro.

En Go, por ejemplo, puedes tener ambos al mismo tiempo:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}
 2
Author: Michael Dorner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-07 08:00:22

Encuentro que tanto YAML como JSON son muy efectivos. Las únicas dos cosas que realmente dictan cuando una se usa sobre la otra para mí es una, con qué se usa el idioma más popularmente. Por ejemplo, si estoy usando Java, Javascript, usaré JSON. Para Java, usaré sus propios objetos, que son bastante JSON pero carecen de algunas características, y lo convertiré a JSON si lo necesito o lo haré en JSON en primer lugar. Lo hago porque eso es algo común en Java y lo hace más fácil para otros Desarrolladores de Java para modificar mi código. La segunda cosa es si lo estoy usando para que el programa recuerde atributos, o si el programa está recibiendo instrucciones en forma de un archivo de configuración, en este caso usaré YAML, porque es muy fácil de leer, tiene una sintaxis agradable y es muy fácil de modificar, incluso si no tienes idea de cómo funciona YAML. Luego, el programa lo leerá y lo convertirá a JSON, o lo que sea preferido para ese idioma.

Al final, honestamente no importa. Tanto JSON como YAML son leídos fácilmente por cualquier programador experimentado.

 0
Author: Triforcey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-06 00:52:30