El formato json (JavaScript Object Notation) es un formato de intercambio de datos ampliamente usado en JavaScript y que se convirtió rápidamente en una alternativa a xml para otros lenguajes de programación. Esto es gracias a que json es mas fácil de usar que xml, de ahí que muchos servicios web usen este formato en sus apis para intercambiar datos. Por ejemplo, la geolocalización de Google o los datos del tiempo de openweathermap.
Json está basado en YAML que es un estándar para todos los lenguajes de programación de serialización de datos, fácil de entender por las personas.
Python dispone de un módulo llamado json para gestionar los intercambios con objetos json desde objetos o ficheros. Hay que tener en cuenta que en json solo se pueden almacenar cadenas, números enteros, números en coma flotante, operadores lógicos, listas y diccionarios, no es posible almacenar los otros tipos de objetos de Python.
Para usar el módulo primero es necesario importarlo con el siguiente comando:
import json
Con el módulo importado se pueden usar, entre otras, los métodos de carga de json, ya sea desde un fichero con json.load() o desde una string con json.loads(). Para grabar un diccionario o string en un fichero se usa json.dump() y si el destino final es un string se usa json.dumps().
json.load(fichero)
Puede tomar varios valores, pero el principal es el manejador del fichero desde donde va a leer el contenido que convertirá en un objeto json. Python trata los datos json como diccionarios.
En el caso del ejemplo se abre el fichero en modo lectura asignándolo a la variable fichero, al hacerlo con with el fichero se cerrará cuando termine el ámbito de ejecución de with. El siguiente paso es asignar a la variable menú el contenido del archivo. Al tratarse de un archivo json, la variable menu pasa a tener el tipo de la clase dict. La siguiente línea de código lo corrobora mostrando en pantalla el tipo de esta variable y después se muestra el contenido de la variable y los elementos del diccionario uno a uno.
El contenido del fichero json, llamado menu.json tiene el siguiente contenido.
{
"Nuevo": "CreaNuevoDocumento()",
"Abrir": "AbrirDocumento()",
"Cerrar": "CerrarDocumento()"
}
El código Python es el siguiente:
import json
with open('menu.json') as fichero:
menu = json.load(fichero)
print('El tipo de menú es: %s' %type(menu))
print(menu)
for elemento in menu:
print('La clave es: %s y su valor es: %s' %(elemento,menu[elemento]))
Y el resultado mostrado en pantalla el siguiente:
python leejson.py
El tipo de menú es: <class 'dict'>
{'Nuevo': 'CreaNuevoDocumento()', 'Abrir': 'AbrirDocumento()', 'Cerrar': 'CerrarDocumento()'}
La clave es: Nuevo y su valor es: CreaNuevoDocumento()
La clave es: Abrir y su valor es: AbrirDocumento()
La clave es: Cerrar y su valor es: CerrarDocumento()
json.loads(string)
En el caso de json.loads() el valor que se toma es un string para convertirlo en el objeto json.
En el siguiente ejemplo tras importar el módulo, se le asigna a la variable datos un texto en formato json. Con la siguiente línea se ve claramente que el tipo de la variable datos es de la clase string. Seguidamente se usa el método json.loads() y se muestra en pantalla su tipo, contenido y elementos.
import json
datos = '''{
"Nuevo": "CreaNuevoDocumento()",
"Abrir": "AbrirDocumento()",
"Cerrar": "CerrarDocumento()"
}'''
print('El tipo de datos es: %s' %type(datos))
menu = json.loads(datos)
print('El tipo de menú es: %s' %type(menu))
print(menu)
for elemento in menu:
print('La clave es: %s y su valor es: %s' %(elemento,menu[elemento]))
El resultado es el siguiente:
python leejsonstring.py
El tipo de datos es: <class 'str'>
El tipo de menú es: <class 'dict'>
{'Nuevo': 'CreaNuevoDocumento()', 'Abrir': 'AbrirDocumento()', 'Cerrar': 'CerrarDocumento()'}
La clave es: Nuevo y su valor es: CreaNuevoDocumento()
La clave es: Abrir y su valor es: AbrirDocumento()
La clave es: Cerrar y su valor es: CerrarDocumento()
json.dump(diccionario, fichero)
Este método se usa para guardar un diccionario en un fichero json, el primer argumento es el diccionario y el segundo es el manejador del fichero. Hay que prestar atención porque si en vez de un diccionario se le pasa una cadena de texto, el método guardará los datos, pero al no tener el formato correcto, luego no se podrán leer.
El siguiente ejemplo guarda el contenido de la variable menú que es de tipo dict() en el fichero menu2.json
import json
menu = {
"Nuevo": "CreaNuevoDocumento()",
"Abrir": "AbrirDocumento()",
"Cerrar": "CerrarDocumento()"
}
print(type(menu))
print(menu)
with open("menu2.json","w") as fichero:
json.dump(menu,fichero)
En pantalla se muestra lo siguiente:
python escribejson.py
<class 'dict'>
{'Nuevo': 'CreaNuevoDocumento()', 'Abrir': 'AbrirDocumento()', 'Cerrar': 'CerrarDocumento()'}
El resultado es un archivo llamado menu2.json con el siguiente contenido:
{"Nuevo": "CreaNuevoDocumento()", "Abrir": "AbrirDocumento()", "Cerrar": "CerrarDocumento()"}
json.dumps(string)
En el caso de json.dumps() el valor que se toma es un objeto json para convertirlo en el string. Como se ha mencionado anteriormente, un objeto json de Python es un diccionario.
En el siguiente ejemplo, tras importar el módulo json, se le asigna a la variable menu un objeto json, es decir un diccionario. Con la línea siguiente se ve claramente que el tipo de la variable datos es de la clase dict. Seguidamente se usa el método json.dumps() para asignar a la variable datos el contenido de la variable menú y se muestra en pantalla su tipo y contenido, viendo que el tipo de la variable datos es de la clase string.
import json
menu = {
"Nuevo": "CreaNuevoDocumento()",
"Abrir": "AbrirDocumento()",
"Cerrar": "CerrarDocumento()"
}
print('El tipo de menu es: %s' %type(menu))
datos = json.dumps(menu)
print('El tipo de datos es: %s' %type(datos))
print(datos)