Matlab

Lectura de JSON con vectores en Matlab

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)

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…

3 días ago

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…

5 días ago

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…

1 semana ago

WOE e IV: La Base Matemática del Credit Scoring

Cuando un banco evalúa una solicitud de crédito necesita responder a una pregunta aparentemente simple:…

2 semanas ago

Lanzamiento de la versión 1.0 del laboratorio de Analytics Lane con nuevas herramientas de scoring

En el octavo aniversario de Analytics Lane seguimos ampliando nuestro laboratorio de aplicaciones interactivas y,…

2 semanas ago

¡Analytics Lane cumple ocho años!

Hoy, 2 de mayo de 2026, Analytics Lane cumple exactamente ocho años. Todo empezó con…

2 semanas ago

This website uses cookies.