JSON (JavaScript Object Notation): JSON: un lenguaje sencillo para intercambio de información

JSON (JavaScript Object Notation) es un formato basado en texto puro legible por personas orientado a la comunicación entre personas y ordenadores o entre ordenadores.

JSON serviría para escribir fichas sobre temas siguiendo unas normas sencillas y flexibles.

Un ejemplo sencillo de JSON: un perro

He aquí un ejemplo sencillo de JSON:

{
  "nombre": "Odín",
  "especie": "perro",
  "peso": 11,
  "edad": 6
}

Uno adivina que la ficha declara que (1) Odín, (2) es un perro, que (3) pesa 11 (kilogramos) y tiene 6 (años).

Ya podemos tres reglas que parecen cumplir los documentos de JSON:

Un ejemplo más completo: un zapato

A continuación veremos un ejemplo con algunos elementos más. Se trata de un modelo de zapato que podría interesarse por ejemplo a un comerciante de zapatos, aunque por motivos de espacio no podemos consignar todos los detalles que en la realidad intesarían a un profesional.

{
  "fabricante": "Ortopedia Levante",
  "modelo": "alicant-3000-c",
  "tipo": "mocasín",
  "para-hombre": true,
  "para-mujer": true,
  "tallas": [39, 40, 41, 42, 43, 45, 47, 49],
  "año": null
}

Observamos que una clave puede corresponderse no sólo con un texto (Ortopedia Levante, mocasín etc.) sino también con un valor de verdadero o falso (true significa verdadero en inglés) o con un conjunto de valores, como [39, 40, 41, 42, 43, 45, 47, 49] en el ejemplo. Por último, un dato podría no conocerse o no quererse dar, en cuyo caso escribimos null. En nuestro caso desconocemos el año en que se creó el modelo.

Por cierto, también en una base de datos relacional podemos asignar a una variable o campo los valores verdadero, falso o nulo. Ahora bien, sólo JSON permite asignar conjuntos de valores, como en "tallas": [39, 40, 41, 42, 43, 45, 47, 49] del ejemplo.

Un ejemplo complementario: nn objeto que contiene objetos

A continuación vamos a poner el ejemplo de un cliente. Por algún motivo a la empresa que hace su ficha le interesa anotar su dirección, la cuál se presta a estructurarse en forma de objeto, de modo que la ficha contendrá a su vez un objeto JSON.

{
  "nombre": "Andrea",
  "apellido": "Schmidt",
  "dirección": {
    "clase": "Avenida",
    "nombre": "Alegría",
    "número": 10
  }
}

Observamos que el campo "dirección" posee un valor de tipo objeto: uno o varios pares de clave-valor encerrados entre llaves y separados por comas. Por supuesto, nada impide escribir un documento JSON con todos los elementos que hemos visto hasta ahora, es decir con valores de tipo:

Comparación con el formato XML

A menudo la misma información que se puede representar en JSON también puede representarse en XML, el Extensible Markup Language (XML). En estos casos JSON resulta más conciso y más sencillo (menos normas sintácticas).

Otra diferencia es que XML es un lenguaje de marcado completo, es decir que en muchos casos consta de un texto al que se han añadido marcas (para denotar por ejemplo capítulos, notas, comentarios).

En resumen;

A continuación pondré un documento JSON que ya hemos analizado, el de un modelo de zapato, y a continuación un posible equivalente en XML:

{
  "nombre": "Andrea",
  "apellido": "Schmidt",
  "dirección": {
    "clase": "Avenida",
    "nombre": "Alegría",
    "número": 10
  }
}

En XML:

<Cliente>
  <nombre></nombre>
  <apellido></apellido>
  <direccion>
    <clase>Avenida</clase>
    <nombre>Alegría</nombre>
    <numero>10</numero>
  </direccion>
</Cliente>

Sintaxis de JSON

JSON consta de tipos atómicos (texto, números--tanto enteros como fraccionarios--, boolenos y null), así como arrays (listas) y objetos.

Un objeto de JSON consta de pares de nombre y valor. El nombre es texto (secuencia de caracteres) entre comillas y el valor es o atómico o compuesto (un array o un objeto a su vez). Los pares se separan mediante comas y se encierran entre llaves.

Nombre y valor de un campo se separan mediante dos puntos.

Un ejemplo:

{
  "nombre": "Pedro",
  "apellidos": ["Mora", "Gutiérrez"],
  "nacido": 1988,
  "cónyuge": null
}

Los signos de puntuación empleados en JSON son:

Objetos en JSON

Un objeto de JSON es un conjunto no ordenado de múltiples pares de nombre y valor. Se escriben entre llaves: { }. Los nombres van seguidos de dos puntos y su valor, con espacios entre medias opcionales. Cada par de un objeto se separa del siguiente mediante coma.

Arrays (listas, tiras...) de JSON

Los arrays se encierran entre corchetes ([]) y sus elementos se separan mediante comas. Un array puede contener, entre otros elementos, un array o un subobjeto. Un array que sólo contenga arrays se consideraría un array multidimensional. Por ejmplo así podríamos representar una matriz numérica de dimensión 3 x 3:

[
  [0, 0 ,1],
  [0, 1, 0],
  [1, 0, 0]]

Un objeto puede a su vez contener objetos y arrays: el valor de un par nombre-valor de un objeto puede ser un array o un objeto.

Por ejemplo, un campo animales podría consisistir en un array de objetos que representasen animales:

"animales": [
  {"tipo":"caballo", "patas": 4},
  {"tipo":"araña", "patas": 8}
 ]

Estructuras recursivas: objetos o arrays de objetos o arrays ...

Un objeto puede contener campos de tipo array u objeto (subobjetos), y un array puede contener campos de tipo objeto u array (subarrays).

Comparación entre estructuras JSON y tablas de bases de datos relacionales

La teoría relacional se caracteriza por que el valor de un campo es atómico, es decir no puede ser ni múltiple (arrays) ni compuesto (objetos).

Por tanto podríamos establecer una equivalencia entre una ficha JSON muy sencilla, reciclando el primer ejemplo de esta página:

{
  "nombre": "Odín",
  "especie": "perro",
  "peso": 11,
  "edad": 6
}

y una file de una tabla relacional.

INSERT into ANIMALES ('Odín', 'perro', 11, 6);

Sin embargo para representar un objeto más complejo necesitaríamos definir varias tablas relacionadas:

Caracteres escapados (especiales) en JSON

Uno escapa un carácter precediéndolo de barra invertida (\).

Los caracteres que pueden o deben escaparse son: ". \, /, b, f, n, r, y t

Esto genera las siguientes secuencias JSON:

Línea nueva en JSON

Basta con teclear la secuencia: \\n dentro de una cadena de caracteres.


\n no es más que la concatenación de dos caracteres.

JSON comparado con JavaScript

En JavaScript, un objeto también puede hacer corresponder un nombre con:

Además, en JSON el texto sólo puede escribirse entre comillas, mientras que en JavaScript también entre apóstrofos y acentos graves.

{"name":"John"}

JSON frente a XML

JSON se procesa y transmite más rápido XML porque se diseñó específicamente para el intercambio de datos. Es conciso y por tanto requiere menos bytes para su almacenamiento y transmisión. Sus analizadores son más sencillos, por tanto tarda menos en procesarse y ocupa menos memoria. XML es lento y pesado porque se diseñó para muchos más usos que el intercambio de datos.

JSON es más fácil de manejar en varios lenguajes de programación (JavaScript, Python, PHP). También es más fácil de leer que XML.

El hecho de que el formato JSON sea idéntico a la sintaxis de los objetos de JavaScript permite que un programa en JavaScript convierta JSON en objetos de JavaScript (mediante JSON.parse()) y viceversa (mediante JSON.stringify()).

Herramientas JSON disponibles en linux

Desde la más sencilla a la más potente:

jq
procesador de JSON en modo texto
jmespath
cuya orden jp es la interfaz de JMESPath, un lenguaje de expresiones para la manipulación de JSON (igual que XPath lo es de XML).
taoJSON

Una biblioteca de C++ sin dependencias ni ejecutables que viene con una clase Value (valor) todouso, emplea Type Traits para interactuar con los tipos de C++, con una Interfaz de Eventos para convertir entre JSON, JAXN, CBOR, MsgPack y UBJSON. Y mucho más.

Los archivos correspondientes se instalan en los siguientes directorios:

  • Cabeceras (*.hpp) en el directorio: /usr/include/tao/json/ y sus subdirectorios
  • Ejemplos (*.cpp) en el directorio: /usr/share/doc/tao-json-examples
CouchDB
Una base de datos de documentos JSON.
MongoDB
Otra base de datos de documentos JSON.
Virtuoso
...

Convertir JSON a otros formatos

Uno almacena colecciones (terminología de MongoDB) de objetos JSON en arrays (de objetos).

No parece que jq sirva para convertir JSON a otros formatos (salvo unos pocos predefinidos), si bien funciona bien para comprobar la sintaxis (validación).

Tras mucho reflexionar y navegar he llegado a la conclusión de que me conviene usar JavaScript porque de fábrica reconoce el formato. No en vano JSON son las siglas de JavaScript Object Notation!

Tal vez, después de desarrollar y depurar código en JavaScript para una página web, lo trasladaría a un programa de node.js...