¿Es la sintaxis de mi documento JSON acorde con su SCHEMA? Muchas veces, cuando estamos programando ficheros JSON, nos hemos planteado esta pregunta a medida que vamos avanzando en el desarrollo de nuestro proyecto. Hoy os enseño un método muy sencillo para validar nuestros ficheros JSON con su correspondiente SCHEMA para ver si los datos que hemos generado son correctos y acordes tal y como se espera. Es un tutorial muy corto y sencillo que cualquier persona puede seguir. Si estás listo, continúa leyendo...
⬇️ Compra en Amazon el hardware que utilizo ⬇️
- 💻 Ordenador Portátil: Descúbrelo aquí
- 🖥️🖥️ Monitores: Mis 2 súper monitores
- ⌨️ Teclado: Mini teclado + Lector DNIe
- 🖱️ Ratón: Mi ratón programable
- 🎧 Auriculares: Súper Auriculares TOP!
- 🖨️ Impresora: Mi fantástica impresora
- 🗄️ NAS Backup: Mi NAS para Backups
- 🔌 HUB USB: Mi HUB para puertos USB
- 📱 Smartphone: Mi Smartphone
- 📲 Tablet: Mi tablet para viajes
- ⌚ Smartwatch: Mi Smartwatch favorito
- 📹 Cámara deportiva: Mi cámara para deportes
¿QUE ES JSON?
JSON, acrónimo de JavaScript Object Notation, es un formato de texto ligero para el intercambio de datos. JSON es un subconjunto de la notación literal de objetos de JavaScript aunque hoy, debido a su amplia adopción como alternativa a XML, se considera un formato de lenguaje independiente.
Una de las supuestas ventajas de JSON sobre XML como formato de intercambio de datos es que es mucho más sencillo escribir un analizador sintáctico (parser) de JSON. En JavaScript, un texto JSON se puede analizar fácilmente usando la función eval(), lo cual ha sido fundamental para que JSON haya sido aceptado por parte de la comunidad de desarrolladores AJAX, debido a la ubicuidad de JavaScript en casi cualquier navegador web.
En la práctica, los argumentos a favor de la facilidad de desarrollo de analizadores o de sus rendimientos son poco relevantes, debido a las cuestiones de seguridad que plantea el uso de eval() y el auge del procesamiento nativo de XML incorporado en los navegadores modernos. Por esa razón, JSON se emplea habitualmente en entornos donde el tamaño del flujo de datos entre cliente y servidor es de vital importancia (de aquí su uso por Yahoo, Google, etc, que atienden a millones de usuarios) cuando la fuente de datos es explícitamente de fiar y donde no es importante el no disponer de procesamiento XSLT para manipular los datos en el cliente.
Si bien es frecuente ver JSON posicionado contra XML, también es frecuente el uso de JSON y XML en la misma aplicación. Por ejemplo, una aplicación de cliente que integra datos de Google Maps con datos meteorológicos en SOAP hacen necesario soportar ambos formatos.
Ejemplo de JSON
1.- ELEMENTOS USADOS EN ESTE TUTORIAL
- GNU/Linux Debian 8.0 64bits
- Conexión a Internet
2.- INSTALACIÓN DE JSON-SPEC
Para instalar el paquete "json-spec", debemos instalar previamente el paquete "pip". Este paquete nos permitirá gestionar e instalar los paquetes auxiliares de tipo Python, como es el caso de json-spec. Primero de todo, y como es habitual, haremos update de nuestros repositorios con el usuario "root" o con otro usuario con privilegios suficientes con "su":
root@localhost# apt-get update
A continuación, instalamos python-pip con el comando:
root@localhost# apt-get install python-pip
Por último, instalamos el paquete json-spec con la utilidad "pip" de la siguiente forma:
root@localhost# pip install json-spec
Si somos un poco vagos, podemos ejecutar todos los pasos de una sola vez con:
root@localhost# apt-get update && apt-get install python-pip && pip install json-spec
3.- FICHERO JSON Y SCHEMA
Para este tutorial, usaremos un fichero de datos JSON llamado (datos.json) y el esquema que debe seguir estará definido en el fichero (esquema.json). Como la sintaxis es sumamente sencilla de entender, tanto del fichero de datos como del esquema, haré solamente un "cut&paste" de ambos ficheros por si los necesitáis para probar.
datos.json
{
"foo": 32,
"bar": "Must equal this value",
"baz": {
"staticProperty": [
"This needs at least one number",
32
],
"property1": "The propertyNames keyword is an alternative to patternProperties",
"property2": "All property names must match supplied conditions (in this case, it's a regex)"
}
}
schema.json
{
"type": "object",
"properties": {
"foo": {
"type": "number"
},
"bar": {
"const": "Must equal this value"
},
"baz": {
"type": "object",
"properties": {
"staticProperty": {
"type": "array",
"contains": {
"type": "number"
}
}
},
"propertyNames": {
"pattern": "^([0-9a-zA-Z]*)$"
},
"additionalProperties": {
"type": "string"
}
}
}
}
4.- VALIDAR JSON + SCHEMA
Para validar tanto nuestro JSOn como nuestro SCHEMA, podemos acudir a la ayuda:
root@localhost:~# json --help
usage: json [-h] [--version] ...
positional arguments:
choose one of these actions
add add fragment to a document
check check member of a document
copy copy a member of a document
extract extract a member of a document
move move a member of a document
remove remove a member of a document
replace replace a member of a document
validate validate a document against a schema
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
Si queremos ver la ayuda específica para el parámetro "validate", ejecutaremos:
root@localhost:~# json validate --help
usage: json validate [-h] [--document-json | --document-file ]
[--schema-json | --schema-file ]
[--indent ]
Validate document against a schema.
optional arguments:
-h, --help show this help message and exit
--document-json
json structure
--document-file
json filename
--schema-json
json structure
--schema-file
json filename
--indent
return an indented json
Tenemos varias opciones para validar nuestros ficheros. Existen 4 formas que vienen en la ayuda y las cuales se muestra a continuación:
examples:
json validate --schema-file=schema.json --document-json='{"foo": ["bar", "baz"]}'
echo '{"foo": ["bar", "baz"]}' | json validate --schema-file=schema.json
json validate --schema-file=schema.json --document-file=doc.json
json validate --schema-file=schema.json doc.json
Para validar nuestro fichero de datos datos.json y nuestro esquema schema.json ejecutaremos una de las 4 opciones del apartado anterior. Por ejemplo:
root@localhost:~# json validate --schema-file=schema.json --document-file=datos.json
Si no sale nada, es que nuestro JSON+SCHEMA son válidos. En caso de que tengamos errores, se nos avisará de ellos. En el punto 5 forzaremos un error para ver como json-spec nos avisa.
5.- VALIDAR JSON + SCHEMA (ERRÓNEO)
Si cambiamos la variable "foo" para que tome un valor que no sea un número, json-spec nos avisará de dicho error:
datos.json
{
"foo": "Not a number",
"bar": "Doesn't equal constant",
"baz": {
"staticProperty": [
"This array needs at least one number"
],
"property1": "The propertyNames keyword is an alternative to patternProperties",
"pr()perty2": "All property names must match supplied conditions (in this case, it's a regex)"
}
}
schema.json
{
"type": "object",
"properties": {
"foo": {
"type": "number"
},
"bar": {
"const": "Must equal this value"
},
"baz": {
"type": "object",
"properties": {
"staticProperty": {
"type": "array",
"contains": {
"type": "number"
}
}
},
"propertyNames": {
"pattern": "^([0-9a-zA-Z]*)$"
},
"additionalProperties": {
"type": "string"
}
}
}
}
Validamos y vemos el error:
root@dns-server:~# json validate --schema-file=schema.json --document-file=datos.json
Exception: document does not validate with schema.
#/foo
- reason Wrong type
ENJOY!