Zamora|León|Oviedo, España

BLOG

✔ Cómo validar ficheros JSON desde consola en GNU/Linux

✔ Cómo validar ficheros JSON desde consola en GNU/Linux

¿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...

 

¿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.



JSONEjemplo 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] <action> ...

positional arguments:
  <action>    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 <doc> | --document-file <doc>]
                     [--schema-json <schema> | --schema-file <schema>]
                     [--indent <indentation>]

Validate document against a schema.

optional arguments:
  -h, --help            show this help message and exit
  --document-json <doc>
                        json structure
  --document-file <doc>
                        json filename
  --schema-json <schema>
                        json structure
  --schema-file <schema>
                        json filename
  --indent <indentation>
                        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!

 


Raúl Prieto Fernández

Sitio Web: www.raulprietofernandez.net

Si quieres ir rápido, ve solo. Si quieres llegar lejos, ve acompañado.

Escribir un comentario

Código de seguridad
Refescar

Acerca de mi

Soy Ingeniero Téc. Industrial Mecánico y Administrador de Sistemas Informáticos.

Contactar conmigo

Dirección: León, España
E-Mail: raul.lnx@gmail.com
Web: http://www.raulprietofernandez.net
Skype: raul.lnx



Follow Me - Instagram

Apúntate Gratis

Entra en la Comunidad VIP y consigue acceso a las descargas en PDF, Trucos y Videotutoriales ocultos y mucho más....

¡Muy Pronto!