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 documento de JSON se entiende más o menos intuitivamente
-
consta de pares
"clave": valorseparados por comas y contenidos entre llaves:{ "clave": valor, "clave": valor, ... } - cada clave adopta un valor numérico o un texto (
Odín
yperro
se consideran textos), si bien más adelente veremos otros tipos de valores, como verdadero, falso, nulo, etc.
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:
- texto, como en
- número, como en
37o como en37,25 trueofalse(es decir, verdadero o falso)null(es decir nulo, desconocido...)- conjunto ordenado, tira, array, como en
[1,3,5,7,11] -
objeto o subobjeto, como en
{ "nombre": "Pedro", "edad": 35 }
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;
- ambos son legibles, los entiende un ser humano a simple vista
- los documentos de JSON se parecen a las fichas de información, mientras que los documentos de XML se parecen a los textos: en XML podemos escribir desde una página web en el dialecto HTML a un libro en el dialecto DocBook.
- XML es más rico y complejo que JSON
- existen gestores de bases de datos que almacenan documentos JSON (MongoDB y CouchDB, entre otras) y/o XML (eXist...)
- existen procedimientos para validar tanto JSON (véase JSON Schema en inglés) como XML (mediante DTD...), es decir para comprobar que se ciñen a un esquema. Por ejemplo, convendría asegurarse de que toda ficha que describa una palabra lleve un campo (1) de tipo texto y (2) denominado
definición
, o que toda ficha sobre una variedad de planta lleve un campo (1) llamadonombre-científico
(2) de tipo texto. En ambos casos escribiríamos un documento en JSON o en XML, respectivamente, que contuviese las reglas o restricciones que ha de cumplir cada documento que queramosvalidar
.
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:
- comillas: rodean nombres de campos y tiras de texto
- llaves para encerrar objetos (
{objeto}) - corchetes para encerrar arrays/listas (
[lista]) - comas para separar elementos de una lista
- dos puntos para separar el nombre de un campo de su valor
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:
\"\\\/: (opcional pero frecuente)\b: retroceso\f\n: nueva línea\r: retorno de carro\t: tabulación\uXXXX: secuencia de unicode
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:
- una función (método)
- una fecha (de la clase
Date) - un objeto de cualquier otra de las clases fundamentales, tales como
Set,RegExp - un objeto de una clase que uno haya definido o copiado
undefined
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
jpes la interfaz deJMESPath, 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...