4.4 KiB
4.4 KiB
Javascript Object Notation
Formato de datos liviano utilizado para intercambio de datos.
Muy utilizado en aplicaciones web.
Modulo JSON incluido en python.
Objetos convertibles en strings JSON:
- dict
- list
- tuple
- string
- int
- float
- boolean
- None
Tabla de conversion formatos
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str | string |
int, long, float | number |
True | true |
False | false |
None | null |
Ejemplos:
- Ejemplo json
- Serializing - Encoding
- Deserializing - Decoding
- Otra forma de decodificar
- Tabla de conversión Python/JSon
Ejemplo de archivo json
./ejemplo.json
{
"nombre": "Juana",
"apellido": "Calambres",
"hobbies": ["correr", "nadar", "acalambrarse"],
"edad": 38,
"descendencia": true,
"hijos": [
{
"nombre": "Ania",
"edad": 5
},
{
"nombre": "Beb",
"edad": 7
}
]
}
Serializing - Encoding
import json
# Convertir diccionario en formato JSON, serializing o encoding (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"
# ]
#}
# Crear archivo persona.json
with open('persona.json', 'w') as archivo:
json.dump(persona, archivo, indent=4)
Deserializing - Decoding
# Convertir archivo JSON en un objeto de Python, deserializing o decoding
persona2 = json.loads(personaJSON)
print(persona2)
#{
# 'name': 'Juan',
# 'edad': 16,
# 'ciudad': 'Cañete',
# 'descendencia': False,
# 'titulos': [
# 'ingeniero',
# 'programador'
# ]
#}
# Desde Archivo
with open('persona.json', 'r') as archivo:
persona3 = json.load(archivo)
print(persona3)
#{
# 'name': 'Juan',
# 'edad': 16,
# 'ciudad': 'Cañete',
# 'descendencia': False,
# 'titulos': [
# 'ingeniero',
# 'programador'
# ]
#}
# 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)
# {"nombre": "Mia", "edad": 27, "Usuario": true}
./persona.json
{
"name": "Juan",
"edad": 16,
"ciudad": "Ca\u00f1ete",
"descendencia": false,
"titulos": [
"ingeniero",
"programador"
]
}
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)
# {"nombre": "Mia", "edad": 27, "Usuario": true}
# 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))
# <class '__main__.Usuario'>
print(usuario.nombre)
# Mia