192 lines
4.4 KiB
Markdown
192 lines
4.4 KiB
Markdown
|
# 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
|
||
|
```
|