Apuntes_Python/02_conceptos/11_JSON/tuto_json.py

78 lines
2.0 KiB
Python
Raw Permalink Normal View History

2022-12-24 22:41:20 -03:00
"""
Javascript Object Notation
"""
import json
# Convertir diccionario en formato JSON, serializing o enconding (ojo con la "ñ")
persona = {"name": "Juan", "edad": 16, "ciudad": "Cañete", "descendencia": False, "titulos": ["ingeniero", "programador"]}
personaJSON = json.dumps(persona, indent=4)
print(personaJSON)
"""
{
"name": "Juan",
"edad": 16,
"ciudad": "Ca\u00f1ete",
"descendencia": false,
"titulos": [
"ingeniero",
"programador"
]
}
"""
with open('persona.json', 'w') as archivo:
json.dump(persona, archivo, indent=4)
# Convertir archivo JSON en un objeto de Python, deserializing o decoding
persona2 = json.loads(personaJSON)
print(persona2)
# desde archivo
print("otra forma")
with open('persona.json', 'r') as archivo:
persona3 = json.load(archivo)
print(persona3)
print("otra forma")
# Clase y funcion personalizada para codificar
class Usuario:
def __init__(self, nombre, edad):
self.nombre = nombre
self.edad = edad
def codificar_usuario(o):
if isinstance(o, Usuario):
return {'nombre': o.nombre, 'edad': o.edad, o.__class__.__name__: True}
raise TypeError('El objeto Usuario no es JSON serializable')
usuario = Usuario('Mia', 27)
usuarioJSON = json.dumps(usuario, default=codificar_usuario)
print(usuarioJSON)
# Otra forma de codificar
from json import JSONEncoder
class CodificarUsuario(JSONEncoder):
def default(self, o):
if isinstance(o, Usuario):
return {'nombre': o.nombre, 'edad': o.edad, o.__class__.__name__: True}
return JSONEncoder.default(self, o)
#usuarioJSON = json.dumps(usuario, cls=CodificarUsuario)
usuarioJSON = CodificarUsuario().encode(usuario)
print(usuarioJSON)
# Funcion personalizada para decodificar JSON en objeto Usuario
def decodificar_usuario(diccionario):
if Usuario.__name__ in diccionario:
return Usuario(nombre=diccionario['nombre'], edad=diccionario['edad'])
return diccionario
usuario = json.loads(usuarioJSON, object_hook=decodificar_usuario)
print(type(usuario))
print(usuario.nombre)