1. Información general
En este artículo rápido, veremos las diferencias entre YAML y JSON a través de ejemplos rápidos y prácticos.
2. Formato
Para tener una mejor imagen, comencemos mirando las representaciones JSON y YAML de un POJO simple:
class Person { String name; Integer age; List hobbies; Person manager; }
Primero, veamos su representación JSON:
{ "name":"John Smith", "age":26, "hobbies":[ "sports", "cooking" ], "manager":{ "name":"Jon Doe", "age":45, "hobbies":[ "fishing" ], "manager":null } }
La sintaxis JSON es algo engorrosa ya que utiliza una sintaxis especial como llaves {} y corchetes [] para representar objetos y matrices.
A continuación, veamos cómo se vería la misma estructura en YAML:
name: John Smith age: 26 hobbies: - sports - cooking manager: name: Jon Doe age: 45 hobbies: - fishing manager:
La sintaxis de YAML parece un poco más amigable ya que usa espacios en blanco para denotar relaciones entre objetos y ' - ' para representar elementos de matriz.
Podemos ver que aunque ambos son fáciles de leer, YAML tiende a ser más legible por humanos.
Otro punto extra para YAML es la cantidad de líneas que se necesitan para representar la misma información: YAML solo toma 11 líneas, mientras que JSON toma 16.
3. Tamaño
Hemos visto en la sección anterior que YAML está representado en menos líneas que JSON, pero ¿eso significa que ocupa menos espacio?
Imaginemos una estructura profundamente anidada con un padre y cinco hijos representados como JSON:
{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":null } } } } } } }
La misma estructura se vería similar en YAML:
child: child: child: child: child: child: child:
A primera vista, puede parecer que JSON ocupa más espacio, pero, en realidad, a la especificación JSON no le importan los espacios en blanco o las nuevas líneas, y se puede acortar de la siguiente manera:
{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}
Podemos ver que la segunda forma es mucho más corta y ocupa solo 74 bytes, mientras que el formato YAML ocupa 97 bytes.
4. Funciones de YAML
Además de las características básicas que proporciona JSON, YAML viene con una funcionalidad adicional como veremos a continuación.
4.1. Comentarios
YAML permite comentarios usando # , una característica que a menudo se desea cuando se trabaja con archivos JSON:
# This is a simple comment name: John
4.2. Cuerdas de varias líneas
Otra característica que falta en JSON pero que está presente en YAML son las cadenas de varias líneas:
website: | line1 line2 line3
4.3. Alias y anclajes
Podemos asignar fácilmente un alias a un elemento específico usando & y anclarlo (hacer referencia) usando * :
httpPort: 80 httpsPort: &httpsPort 443 defaultPort: *httpsPort
5. Desempeño
Debido a la naturaleza simple de la especificación JSON, su rendimiento en el análisis / serialización de datos es mucho mejor que YAML.
Vamos a implementar un punto de referencia simple para comparar la velocidad de análisis de YAML y JSON usando JMH.
Para el punto de referencia YAML, usaremos la conocida biblioteca snake-yaml , y para nuestro punto de referencia JSON, usaremos org-json :
@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Measurement(batchSize = 10_000, iterations = 5) @Warmup(batchSize = 10_000, iterations = 5) @State(Scope.Thread) class Bench { static void main(String[] args) { org.openjdk.jmh.Main.main(args); } @State(Scope.Thread) static class YamlState { public Yaml yaml = new Yaml(); } @Benchmark Object benchmarkYaml(YamlState yamlState) { return yamlState.yaml.load("foo: bar"); } @Benchmark Object benchmarkJson(Blackhole blackhole) { return new JSONObject("{\"foo\": \"bar\"}"); } }
Como era de esperar, JSON es el ganador, siendo aproximadamente 30 veces más rápido:
Benchmark Mode Cnt Score Error Units Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops/s Main2.benchmarkYaml thrpt 50 20.351 ± 0.312 ops/s
6. Disponibilidad de la biblioteca
JavaScript es el estándar para la web, lo que significa que es casi imposible encontrar un lenguaje que no sea totalmente compatible con JSON.
Por otro lado, YAML es ampliamente compatible, pero no es un estándar. Esto significa que existen bibliotecas para los lenguajes de programación más populares, pero debido a su complejidad, es posible que no implementen completamente la especificación.
7. ¿Qué debo elegir?
Esta puede ser una pregunta difícil de responder y subjetiva en muchos casos.
Si necesitamos exponer un conjunto de API REST a otras aplicaciones de front-end o back-end, probablemente deberíamos optar por JSON, ya que es el estándar de facto de la industria.
Si necesitamos crear un archivo de configuración que a menudo será leído / actualizado por humanos, YAML podría ser una buena opción.
Por supuesto, también puede haber casos de uso en los que YAML y JSON encajarían bien, y será solo una cuestión de gustos.
8. Conclusión
En este artículo rápido, hemos aprendido las principales diferencias entre YAML y JSON y qué aspectos debemos considerar para tomar una decisión informada sobre cuál elegir.