Revista Informática

Trabajar con datos en formato JSON en Matlab

Publicado el 14 noviembre 2018 por Daniel Rodríguez @analyticslane

JSON es un formato de texto ligero pensado para el intercambio de información entre aplicaciones. El origen de este se encuentra en la notación de objetos empleada en el lenguaje de programación JavaScript. Siendo su nombre el acrónimo de "JavaScript Object Notation" (Notación de Objeto de JavaScript). Por eso la mayoría de aplicaciones web publican los datos de las consultas utilizando JSON. Posiblemente debido a su popularidad en la versión R2016b de Matlab se introdujeron para la codificación y descodificación de este formato. En esta entrada se va a explicar cómo trabajar con archivos JSON en Matlab.

Las funciones incluidas en Matlab para el tratamiento de archivos JSON son dos jsondecode y jsonencode. La primera permite convertir una cadena de texto con datos en formato JSON a un objeto Matlab. Mientras la segunda realiza el proceso contrario, convierte los objetos Matlab en cadenas de texto con formato JSON. Actualmente no existe una función para importar directamente archivos JSON, aunque como estos son simples archivos de texto se pueden importar los datos con las funciones estándar. O desde la web con la función webread.

A modo de ejemplo se puede crear un archivo JSON en Mockaroo y descargarlo al disco duro. En nuestro caso se va a trabajar con el siguiente archivo.

[{
        "id": 1,
        "first_name": "Holden",
        "last_name": "Rodgier",
        "email": "[email protected]", "gender": "Male", "ip_address": "199.195.195.123", "total": "7.66" }, { "id": 2, "first_name": "Lacey", "last_name": "Coddrington", "email": "[email protected]", "gender": "Female", "ip_address": "123.83.127.101", "total": "12.59" }, { "id": 3, "first_name": "Leshia", "last_name": "Francescuccio", "email": "[email protected]", "gender": "Female", "ip_address": "54.248.253.8", "total": "11.62" }, { "id": 4, "first_name": "Charla", "last_name": "Peerman", "email": "[email protected]", "gender": "Female", "ip_address": "189.170.54.121", "total": "10.06" }, { "id": 5, "first_name": "Antin", "last_name": "Petrashkov", "email": "[email protected]", "gender": "Male", "ip_address": "103.219.106.206", "total": "20.28" } ]

En Matlab este archivo se puede importar utilizando la función fileread. Para ello solamente se ha de escribir:

json = fileread('MOCK_DATA.json');

Con lo que se obtiene una cadena de texto con el contenido del archivo. Ahora se puede utilizar la función jsondecode para decodificar el contenido del archivo

data = jsondecode(json);

En la variable data se puede encontrar un objeto struct con los datos ya accesibles.

data = 

  5×1 struct array with fields:

    id
    first_name
    last_name
    email
    gender
    ip_address
    total

Por ejemplo, el primer elemento del array será.

ans = 

  struct with fields:

            id: 1
    first_name: 'Holden'
     last_name: 'Rodgier'
         email: '[email protected]' gender: 'Male' ip_address: '199.195.195.123' total: '7.66'

La mayoría de los objetos Matlab se pueden convertir en una cadena de texto JSON mediante la función jsonencode. Uno de los objetos más fáciles de convertir es una vector.

json = jsonencode(1:5);

Este código asigna la siguiente cadena a la variable json.

'[1,2,3,4,5]'

JSON es un formato en el que se puede almacenar datos con una cierta estructura, lo que en Matlab son los objetos tipo struct. Así exportar una estructura es igual de fácil que un vector.

json = jsonencode(struct('data', 1:5));

Asignando a la variable json la cadena

'{"data":[1,2,3,4,5]}'

Al codificar datos en los que exista valores infinito o NaN sucede algo curioso, la información se pierde ya que almacena como un valor null. Esto es lo que se puede ver en el siguiente ejemplo.

jsonencode([1, NaN, inf])

ans =

    '[1,null,null]'

En caso de que se desee recuperar la información se tendrá el siguiente resultado

jsondecode(jsonencode([1, NaN, inf]))

ans =

     1
   NaN
   NaN

Para evitar este problema, si los datos se desean utilizar posteriormente en otra sesión de Matlab, se pude cambiar la opción 'ConvertInfAndNaN' de la función jsonencode a un valor igual a false. A modo de ejemplo se puede ver el resultado por defecto de

jsonencode([1, NaN, inf], 'ConvertInfAndNaN', true)

ans =

    '[1,null,null]'

Ahora se puede comprobar cómo toda la información en el vector original se puede recuperar.

jsondecode(jsonencode([1, NaN, inf], 'ConvertInfAndNaN', false))

ans =

     1
   NaN
   Inf

Es importante notar que la mayoría de las aplicaciones no pueden no comprender los valores NaN e infinito. Por los que es necesario tener cuidado a la hora de utilizar esta opción.

En esta entrada se ha visto las funciones disponibles en Matlab para trabajar con cadenas de texto con JSON. La decodificación de cadenas de texto en objetos Matlab se realiza con jsondecode. Por otro lado, el proceso inverso se realiza mediante la función jsonencode.

A diferencia de lo visto con los archivos JSON en Python. En Matlab no existe una función que importe y realice la decodificación de archivos JSON, siendo necesario importar previamente los datos con alguna de las funciones disponibles. Lo mismo se aplica al proceso de exportación.

Imágenes: Pixabay (Gerd Altmann)


Volver a la Portada de Logo Paperblog