Apuntes_Python/02_conceptos/11_JSON
2024-01-16 12:23:41 -03:00
..
ejemplo.json init Apuntes Python 2022-12-24 22:41:20 -03:00
persona.json init Apuntes Python 2022-12-24 22:41:20 -03:00
README.md ed: domain links on files <kickto.net >letz.dev 2024-01-16 12:23:41 -03:00
tuto_json.py init Apuntes Python 2022-12-24 22:41:20 -03:00

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

W3Schools

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 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