yml parser online library lib caracteristicas archivos json yaml

json - parser - yaml schema



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

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

  • Rendimiento (codificar / decodificar tiempo)
  • 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 integrado para almacenar archivos de configuración.

Relacionado:

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


Eludiendo la teoría esotérica

Esto responde al título, no a los detalles, ya que la mayoría simplemente leen el título de un resultado de búsqueda en google como yo, así que sentí que era necesario explicarlo desde la perspectiva de un desarrollador web .

  1. YAML utiliza la sangría de espacios en blanco, que es un territorio familiar para los desarrolladores de Python.
  2. Los desarrolladores de JavaScript adoran JSON porque es un subconjunto de JavaScript y se pueden interpretar y escribir directamente dentro de JavaScript, además de usar una forma abreviada de declarar JSON, sin necesidad de comillas dobles en las claves cuando se usan nombres de variables típicos sin espacios.
  3. Hay una gran cantidad de analizadores que funcionan muy bien en todos los idiomas para YAML y 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 los 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 manualmente 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 las características significativamente menos que YAML para verificar, lo que permite que un código más pequeño y ligero procese 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 que es necesario para que YAML se interprete correctamente junto con la sangría adecuada, encontrará que YAML realmente requiere más caracteres que JSON. JSON no utiliza los espacios en blanco para representar la jerarquía o el agrupamiento y se puede allanar fácilmente eliminando espacios en blanco innecesarios para un transporte más compacto.

El elefante en la habitación: la propia Internet.

JavaScript claramente domina la web por un gran margen y los desarrolladores de JavaScript prefieren usar JSON como el formato de datos de manera abrumadora junto con las API web populares, por lo que se vuelve difícil argumentar el uso de YAML sobre JSON cuando se realiza la programación web en el sentido general, ya que probablemente será superado en un ambiente de equipo. De hecho, la mayoría de los programadores web ni siquiera saben que YAML existe, por no hablar de usarlo.

Si está realizando alguna programación web, JSON es la forma predeterminada de ir porque no se necesita un paso de traducción cuando se trabaja con JavaScript, por lo que debe presentar un mejor argumento para usar YAML sobre JSON en ese caso.


GIT y YAML

Las otras respuestas son buenas. Lee esos primero. Pero agregaré 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 de git puede almacenar igualmente archivos JSON y YAML, el método "diff" utilizado para rastrear y mostrar cambios en un archivo está orientado a la línea. Dado que YAML se ve forzado a estar orientado a la línea, cualquier cambio pequeño 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" al ordenar las cadenas / claves y agregar sangría. Pero esto no es el predeterminado y soy perezoso.

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

Además, si la velocidad y el espacio son realmente una preocupación, tampoco uso. Es posible que desee mirar a BSON.


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

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

type Person struct { Name string `json:"name" yaml:"name"` Age int `json:"age" yaml:"age"` }


Considero 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 entiende el problema.

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

Más aún, 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?


Dado que esta pregunta ahora ocupa un lugar destacado al buscar YAML y JSON, vale la pena señalar una diferencia rara vez citada entre los dos: licencia. JSON pretende tener una license que los usuarios de JSON deben cumplir (incluido el legalmente ambiguo "se usará para el bien, no para el mal"). YAML no tiene tal reclamo de licencia, y esa podría ser una diferencia importante (para su abogado, si no para usted).


Diferencias:

  1. YAML, dependiendo de cómo lo uses, puede ser más legible que JSON
  2. JSON es a menudo faster y probablemente aún sea interoperable con más sistemas
  3. Es posible escribir un analizador JSON "suficientemente bueno" muy rápidamente
  4. Las claves duplicadas, que son JSON potencialmente válidas, son definitivamente YAML no válidas.
  5. YAML tiene un montón de características, incluidos comentarios y anclajes relacionales. La sintaxis de YAML es bastante compleja 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, aún es posible una "bomba yaml" (ver bomba xml ).
  7. Debido a que no hay referencias, es imposible serializar estructuras complejas con referencias de objetos en JSON. La serialización YAML por lo tanto puede ser más eficiente.
  8. En algunos entornos de codificación, el uso de YAML puede permitir que un atacante ejecute código arbitrario .

Observaciones:

  1. Los programadores de Python son generalmente grandes fanáticos de YAML, debido al uso de sangría, en lugar de la 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 los datos dejará el entorno de una aplicación, se analizará dentro de una IU 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 de gramática, y a menudo es una mejor opción que inventar un nuevo idioma.

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é lenguaje se usa más popularmente. Por ejemplo, si estoy usando Java, Javascript, usaré JSON. Para Java, usaré sus propios objetos, que son prácticamente JSON pero carecen de algunas características, y los convertiré a JSON si es necesario o lo haré en JSON en primer lugar. Lo hago porque eso es algo común en Java y facilita que otros desarrolladores de Java modifiquen mi código. Lo segundo es si lo estoy usando para que el programa recuerde los 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 por humanos, tiene una buena busca sintaxis 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 se prefiera para ese idioma.

Al final, honestamente no importa. Tanto JSON como YAML son fáciles de leer por cualquier programador experimentado.


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 como JSON se usa mucho y es tan fácil de implementar, ha tendido a recibir un mayor soporte nativo y, por lo tanto, velocidad. Teniendo en cuenta que YAML hace todo lo que JSON hace, más un camión más, es probable que de cualquier implementación comparable de ambas, la JSON sea más rápida.

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 pueda ser 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 representan la misma estructura de datos.

Expresividad

Como han dicho otros, los programadores de Python tienden a preferir YAML, los programadores de JavaScript a JSON. Haré estas observaciones:

  • Es fácil memorizar toda la sintaxis de JSON y, por lo tanto, tener mucha confianza en la comprensión del significado de cualquier archivo JSON. YAML no es verdaderamente comprensible para ningún humano. El número de sutilezas y casos extremos es extremo.
  • Debido a que pocos analizadores implementan la especificación completa, es aún 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 amplio soporte, pero es menos ubicuo que JSON, y cada analizador implementa un subconjunto diferente. Por lo tanto, los archivos YAML son menos interoperables de lo que piensas.

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.


Si no necesita ninguna característica que YAML tiene 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 apoyo. No creo que la velocidad de análisis o el uso de la memoria sean muy diferentes, y tal vez no sea una parte importante del rendimiento de su programa.


Técnicamente YAML 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 que YAML sea más conciso y legible (para el ojo entrenado).

¿Cuál elegir?

  • Las características adicionales de YAML y la notación concisa lo convierten en una buena opción para archivos de configuración ( archivos no proporcionados por el usuario).
  • Las funciones limitadas de JSON , el amplio soporte y el análisis más rápido lo convierten en una excelente opción para la interoperabilidad y los datos proporcionados por el usuario .

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.

Consulte las especificaciones oficiales, en la sección titulada "YAML: Relación con JSON" .

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

  • Como señaló @jdupont , YAML es visualmente más fácil de ver. De hecho, la página de inicio de YAML es válida en sí misma, pero 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 información relacional como se puede encontrar en una base de datos MySQL.
  • YAML es más sólido en cuanto a la incrustación de 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 será importante para las cosas que usted o yo hacemos, pero a largo plazo, creo que YAML será un formato de serialización de datos más sólido y viable.

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

Encontrarás 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 .