# Javascript Object Notation Formato de datos liviano utilizado para intercambio de datos. Muy utilizado en aplicaciones web. Modulo [JSON](https://docs.python.org/3/library/json.html) incluido en python. ##### Objetos convertibles en strings JSON: - dict - list - tuple - string - int - float - boolean - None [W3Schools](https://www.w3schools.com/python/python_json.asp) #### 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](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/11_JSON#ejemplo-json) - [Serializing - Encoding](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/11_JSON#serializing-encoding) - [Deserializing - Decoding](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/11_JSON#deserializing-decoding) - [Otra forma de decodificar](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/11_JSON#otra-forma-de-codificar) - [Tabla de conversión Python/JSon](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/11_JSON#tabla-de-conversion-formatos) ---- ### Ejemplo de archivo json ***` ./ejemplo.json `*** ```json { "nombre": "Juana", "apellido": "Calambres", "hobbies": ["correr", "nadar", "acalambrarse"], "edad": 38, "descendencia": true, "hijos": [ { "nombre": "Ania", "edad": 5 }, { "nombre": "Beb", "edad": 7 } ] } ``` ### Serializing - Encoding ```python 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 ```python # 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' # ] #} ``` ```python # 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*** ```json { "name": "Juan", "edad": 16, "ciudad": "Ca\u00f1ete", "descendencia": false, "titulos": [ "ingeniero", "programador" ] } ``` ### Otra forma de codificar ```python 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)) # print(usuario.nombre) # Mia ```