Resolver conflictos en Git. Merge, Squash, Rebase o Pull
Copiar y pegar desde la terminal

Comparando TOML, JSON y YAML

TOML, JSON y YAML

TOML, JSON y YAML son diferentes formatos de ficheros de configuración muy utilizados a día de hoy. Este artículo debería ayudarte a ver cómo se estructuran los datos a través de estos formatos de datos.

Por ejemplo, Hugo puedes utilizar estos tres formatos de datos para la configuración, el front matter y los datos personalizados, pero TOML es el formato recomendado para todo el proyecto. En primer lugar, se hará una breve introducción a cada uno de los formatos de datos por separado, antes de entrar de lleno en las especificaciones y comparaciones.

Índice:

TOML (Tom’s Obvious, Minimal Language)

TOML fue obviamente escrito por Tom, para ser precisos por Tom Preston-Werner. Es un proyecto de código abierto con licencia MIT y tiene muchísimas estrellitas en Github. La primera versión de TOML se publicó en marzo de 2013, lo que califica a TOML como el más joven de los tres estándares.

TOML pretende ser un formato de archivo de configuración mínimo y fácil de leer gracias a una semántica precisa. TOML está diseñado para mapear de forma inequívoca una tabla hash. TOML debe ser fácil de parsear en estructuras de datos en una amplia variedad de lenguajes.

Datos rápidos sobre la sintaxis de TOML

  • TOML distingue entre mayúsculas y minúsculas.
  • Un archivo TOML debe contener sólo caracteres Unicode codificados en UTF-8.
  • Los espacios en blanco son tabulaciones (0x09) o espacios (0x20).
  • Una nueva línea significa LF (0x0A) o CRLF (0x0D0A).

Para utilizar TOML en el asunto principal, es necesario envolverlo entre +++ como:

+++
date = "2016-12-14T21:27:05.454Z"
publishdate = "2016-12-14T21:27:05.454Z"

title = "Deep dive into TOML, JSON and YAML"
tags = ["toml","yaml","json", "front matter"]

type = "article"

[amp]
    elements = []
    
[article]
    lead = "Lorem ipsum."
    category = "frontmatter"
    related = []

[sitemap]
  changefreq = "monthly"
  priority = 0.5
  filename = "sitemap.xml"
+++

YAML (Lenguaje de Marcado Ain)

YAML es un lenguaje muy extendido y utilizado para archivos de configuración en diferentes lenguajes y frameworks. El creador y mantenedor de YAML es Clark C. Evans, comenzó como SML-DEV, una lista de gente de XML centrada en la simplificación de XML ayudó a producir Common XML, un subconjunto altamente funcional de XML fundado una alternativa a XML para la serialización de datos, especialmente con Python, Perl y Ruby. El proyecto comenzó en 2001, y la primera versión 1.0 salió en enero de 2009 por Oren Ben-Kiki, Clark Evans y Brian Ingerson. Desde 2009 se utiliza la versión 1.2 actual.

Datos rápidos sobre la sintaxis de YAML

  • los archivos .yml comienzan con ‘-‘, marcando el inicio del documento
  • los pares clave-valor están separados por dos puntos
  • las listas comienzan con un guión
  • YAML utiliza la sangría con uno o más espacios para describir colecciones anidadas

Para utilizar YAML en la materia principal, es necesario envolverlo entre — como:

---
date: '2016-12-14T21:27:05.454Z'
publishdate: '2016-12-14T21:27:05.454Z'
title: Deep dive into TOML, JSON and YAML
tags:
- toml
- yaml
- json
- front matter
type: article
amp:
  elements: []
article:
  lead: Lorem ipsum.
  category: frontmatter
  related: []
sitemap:
  changefreq: monthly
  priority: 0.5
  filename: sitemap.xml
---

JSON (JavaScript Object Notation)

JSON es un formato ligero de intercambio de datos. JSON se utiliza ampliamente para la comunicación API entre el navegador y el servidor en el mundo de la web, ya que JavaScript y la mayoría de los lenguajes del lado del servidor soportan JSON de forma nativa. A principios de la década de 2000, Douglas Crockford introdujo la primera especificación del formato de datos JSON. La versión actual especificada por ECMA-404 data de octubre de 2013.

Un comando que puede ayudar para visualizar JSON en la terminal es jq.

Datos rápidos sobre la sintaxis de JSON

  • Datos almacenados en pares nombre/valor.
  • Registros separados por comas. No se permite el uso de comas al final de la propiedad.
  • Las comillas dobles envuelven los nombres de las propiedades y las cadenas. Las comillas simples no están permitidas.

Dado que JSON se envuelve en dos llaves {} no es necesario un envoltorio especial para utilizarlo dentro de la materia frontal en Hugo:

{
    "date" : "2016-12-14T21:27:05.454Z",
    "publishdate" : "2016-12-14T21:27:05.454Z",
    "title" : "Deep dive into TOML, JSON and YAML",
    "tags" : ["toml","yaml","json", "front matter"],
    "type" : "article",
    "amp" : {
        "elements" : []
    },
    "article" : {
        "lead" : "Lorem ipsum.",
        "category" : "frontmatter",
        "related" : []
    },
    "sitemap" : {
      "changefreq" : "monthly",
      "priority" : 0.5,
      "filename" : "sitemap.xml"
    }
}

Diferencias sintácticas entre TOML, YAML y JSON

Veamos ahora las diferencias sintácticas y de características en los casos de uso más comunes.

Strings

Cualquiera de los formatos soporta Strings. La única diferencia es que JSON no admite cadenas multilínea.

TOML

key = "String Value"
multiline = """\
       The quick brown \
       fox jumps over \
       the lazy dog.\
       """

YAML

key : String Value
multilinePreservedLinebreaks:
|
  L1 - The quick brown
  L2 - fox jumps over
  L3 - the lazy dog.
multilineReplaceLinebreaksWithWhitespace:
>
  This sentence ist just too long to keep it
  on the same line.

JSON

{
  "key" : "String Value"
}

Objects / Hash Tables / Collections

Las tablas en TOML es más o menos lo mismo que los objetos en JSON y las colecciones en YAML.

TOML

[table_key]
property = "Value"
secondProperty = "2nd Value"

[alternative.direct]
access = "results in alternative.direct.access for this value"

alternativeCalledInlineTable = { property = "Value", "etc" = "You got it." }

YAML

objectKey:
  property: Value
  secondProperty: 2nd Value
alternative: { subkey: 5.0, another: 123 }

JSON

{
  "objectKey" : {
    "property" : "Value",
    "secondProperty" : "2nd Value"
  }
}

Arrays / Lists

Todos los idiomas admiten las matrices o las listas.

TOML

fruits = [ "Apple", "Banana", "Strawberry" ]
formats = [
  "YAML",
  "JSON",
  "TOML"
]

YAML

fruits:
  - Apple
  - Banana
  - Strawberry
formats: [ YAML, JSON, TOML ]

JSON

{
  "fruits": ["Apple","Banana","Strawberry"],
  "formats": [
    "YAML",
    "JSON",
    "TOML"
  ]
}

Para ampliar un poco estos ejemplos podemos crear una lista de Objetos / Tablas / Colecciones también así:

TOML

[[fruits]]
name = "Apple"
weight = 600

[[fruits]]
name = "Banana"
weight = 300

[[fruits]]
name = "Strawberry"
weight = 40

YAML

fruits:
- name: Apple
  weight: 600
- name: Banana
  weight: 300
- name: Strawberry
  weight: 40

JSON

{
  "fruits": [
    {
        "name" : "Apple",
        "weight" : 600
    },
    {
        "name" : "Banana",
        "weight" : 300
    },
    {
        "name" : "Strawberry",
        "weight" : 40
    }
  ]
}

Creo que ahora se entiende bastante bien cómo funcionan las matrices y las tablas; ampliémos un poco más para tener una visión completa.

TOML

[[fruits]]
  name = "Apple"
  weight = 600

  [fruit.physical]
    color = "red"
    shape = "round"

  [[fruit.variety]]
    name = "red delicious"

  [[fruit.variety]]
    name = "granny smith"

[[fruits]]
  name = "Banana"
  weight = 300

  [fruit.physical]
    color = "yellow"
    shape = "curved"
    
  [[fruit.variety]]
    name = "plantain"
    
[[fruits]]
  name = "Strawberry"
  weight = 40

  [fruit.physical]
    color = "red"
    shape = "kind-of-oval"
    
  [[fruit.variety]]
    name = "the-good-one"

YAML

fruits:
- name: Apple
  weight: 600
  physical:
    color: red
    shape: round
  variety:
  - name: red delicious
  - name: granny smith
- name: Banana
  weight: 300
  physical:
    color: yellow
    shape: curved
  variety:
  - name: plantain
- name: Strawberry
  weight: 40
  physical:
    color: red
    shape: kind-of-oval
  variety:
  - name: the-good-one

JSON

{
  "fruits": [
    {
        "name" : "Apple",
        "weight" : 600,
        "physical": {
          "color": "red",
          "shape": "round"
        },
        "variety": [
          { "name": "red delicious" },
          { "name": "granny smith" }
        ]
    },
    {
        "name" : "Banana",
        "weight" : 300,
        "physical": {
          "color": "yellow",
          "shape": "curved"
        },
        "variety": [
          { "name": "plantain" }
        ]
    },
    {
        "name" : "Strawberry",
        "weight" : 40,
        "physical": {
          "color": "red",
          "shape": "kind-of-oval"
        },
        "variety": [
          { "name": "the-good-one" }
        ]
    }
  ]
}

Números (Integer, Floats, Infinity etc.)

Los números se escriben de forma muy similar en todas las estructuras de datos, con diferencias en el conjunto de características:

TOML

explicit_pos = +99
positive = 42
zero = 0
negative = -17

# For large numbers, you may use underscores to enhance readability.
# Each underscore must be surrounded by at least one digit.
large = 1_000
verylarge = 5_349_221

# fractional
float = +1.0
float_pi = 3.1415
negative_float = -0.01

# exponent
flt4 = 5e+22
flt5 = 1e6
flt6 = -2E-2

# both
flt7 = 6.626e-34

YAML

integer: 12
octal_number: 014
hexadecimal: 0xC
float: 18.6
exponential: 1.2e+32
infinity: .inf

JSON

{
  "integer": 12,
  "octal_number": 12,
  "hexadecimal": 12,
  "float": 18.6,
  "exponential": 1.2e+32
}

Misc – Datetime, Boolean, Null

TOML

bool1 = true
bool2 = false

date1 = 1979-05-27T07:32:00Z
date2 = 1979-05-27T00:32:00-07:00
date3 = 1979-05-27T00:32:00.999999-07:00

YAML

bool1: true
bool2: false

null1: null
null2: ~

date_iso: 2016-12-14T21:59:43.10-05:00 # ISO-8601
date_simple: 2016-12-14

JSON

{
  "bool1": true,
  "bool2": false,
  "null1": null,
  "date_iso": "2016-12-14 21:59:43 -0500",
  "date_simple": "2016-12-14"
}

Espero que con los anteriores ejemplos se haya conseguido una buena visión general de las diferencias entre estas 3 estructuras de datos. Ahora para coger soltura solo queda practicar.

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar