Revista Informática

Lectura de JSON con vectores en Matlab

Publicado el 17 junio 2019 por Daniel Rodríguez @analyticslane

En una entrada anterior se ha explicado cómo se pueden leer archivos JSON desde Matlab. Allí se había mostrado el proceso básico de importación y la lectura de valores, pero no lo que es necesario hacer cuando los valores de los campos contienen datos más complejos como vectores de objetos. Siendo estos los pasos que se van a explicar en esta entrada: cómo realizar la lectura de JSON con vectores en Matlab.

El archivo JSON

Antes de comenzar es necesario disponer de un archivo JSON, para ello se puede utilizar el siguiente.

{
    "date": "2019-05-01",
    "users": [
        [{
            "name": "Alice",
            "amount": 100
        }, {
            "name": "Bob",
            "amount": -200
        }, {
            "name": "Charlie",
            "amount": 300
        }, {
            "name": "Dennis",
            "amount": 400
        }, {
            "name": "Edith",
            "amount": -500
        }]
    ],
    "transactions": [{
        "from": "Alice",
        "to": "Bon",
        "amount": 200,
        "tax": 20
    }, {
        "from": "Charlie",
        "to": "Dennis",
        "amount": 50
    }]
}

En este se puede ver que existen tres propiedades: date, users y transactions. El primero, la fecha, es una cadena de texto. Siendo este una propiedad que no presenta ningún problema. Por otro lado, la segunda, los usuarios, es un listado con los usuarios y su saldo disponible. Finalmente, el tercero, las transacciones, contiene diferentes operaciones en las que pueden existir o no valores como tax.

Importación de los datos

La importación de los archivos JSON en Matlab se tiene que hacer en dos pasos, en primer lugar, se han de leer el archivo y posteriormente decodificarlo. Lo que se hace respectivamente con fileread y jsondecode. Así para importar todo el archivo en una variable es necesario ejecutar el siguiente código.

values = jsondecode(fileread('data.json'));

Para obtener los valores de las fechas se puede utilizar lo que se explicó en la entrada anterior. Pero si se hace esto para los nombres de los usuarios no se obtiene el valor esperado.

date = values.date
name = values.users.name
date =

    '2019-05-01'


name =

    'Alice'

Al ejecutar este pequeño trozo de código se puede ver que solamente se obtienen un nombre de la lista. Esto es así porque values.users es un vector de estructuras. Cuando se accede una propiedad de un vector de este tipo y no se indica el índice Matlab va a leer solamente el primero. Para leer todos dos valores es necesario iterar a través de este vector como se muestra a continuación.

for i = 1:length(values.users)
    fprintf('User: %s, amount: %d\n', values.users(i).name, values.users(i).amount);
end
User: Alice, amount: 100
User: Bob, amount: -200
User: Charlie, amount: 300
User: Dennis, amount: 400
User: Edith, amount: -500

En donde se puede observar cómo se pueden leer todos los valores de la propiedad users.

Importación de registros con datos heterogéneos

En el caso de la propiedad transactions podemos ver que los datos que contiene esta son diferente para cada uno de los registros. En tal caso los valores de la propiedad no se cargarán como un vector, sino como una celda de objetos. Siendo necesario tener esto en cuenta a la hora de operar con los valores. En primer lugar, para acceder a unos registros se tiene que utilizar llaves en lugar de paréntesis. Por otro lado, cada vez que se pretenda leer un registro será necesario comprobar si este existe o no. Así en nuestro ejemplo podríamos iterar con el siguiente código.

for i = 1:length(values.transactions)
    if isfield(values.transactions{i}, 'tax')
        fprintf('[%s, %s, %d, %d]\n', values.transactions{i}.from, ...
            values.transactions{i}.to, values.transactions{i}.amount, ...
            values.transactions{i}.tax);
    else
         fprintf('[%s, %s, %d]\n', values.transactions{i}.from, ...
            values.transactions{i}.to, values.transactions{i}.amount);
    end
end
[Alice, Bon, 200, 20]
[Charlie, Dennis, 50]

En donde se tiene comprueba antes de imprimir los resultados si el campo tax existe o no, ya que este es opcional.

Comprobar si es una celda o un vector

Dado que es necesario iterar de una forma diferente en cada ocasión puede ser necesario comprobar si lo que se tiene es una celda o un vector. En el caso de valores cuyos valores tiene que se siempre iguales no habría problema, siempre se tiene un vector. Pero, en el caso de que los valores pudiesen ser diferentes se podrán dar los dos casos. Así antes de iterar se puede comprobar el tipo de dato con iscell.

Conclusiones

En esta entrada se han visto cómo realizar la lectura de JSON con vectores en Matlab. Algo que se complica a medida que se complica la complejidad de los datos importados. A la hora de importar datos desde archivos JSON es necesario saber qué datos pueden venir, en que estructuras y preparar el código para tener en cuenta las opciones con las que se puede enfrentar.

Imágenes: Pixabay (Free-Photos)

No te olvides valorar esta entrada

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones de Analytics Lane.

Contenido relacionado


Volver a la Portada de Logo Paperblog