Apuntes_Python/02_conceptos/11_JSON/README.md

192 lines
4.4 KiB
Markdown
Raw Normal View History

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](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))
# <class '__main__.Usuario'>
print(usuario.nombre)
# Mia
```