Serializar y deserializar JSON complejo en Python

JSON significa Notación de objetos de JavaScript. Es un formato que codifica los datos en formato de string. JSON es independiente del idioma y, por eso, se usa para almacenar o transferir datos en archivos. La conversión de datos de la string de objetos JSON se conoce como serialización y su objeto JSON de string opuesto se conoce como deserialización. El objeto JSON se define mediante llaves {} y consta de un par clave-valor. Es importante tener en cuenta que la clave del objeto JSON es una string y su valor puede ser cualquier tipo de datos primitivo (p. ej., int, string, nulo) o complejo (p. ej., array).

Ejemplo de objeto JSON:

{
 "id":101,
 "company" : "GeeksForGeeks"
}

Los objetos JSON complejos son aquellos objetos que contienen un objeto anidado dentro de otro. Ejemplo de objeto JSON complejo.

{
 "id":101,
 "company" : "GeeksForGeeks",
 "Topics" : { "Data Structure",
              "Algorithm",
              "Gate Topics" }
}

Serialización y deserialización

Python y el módulo JSON funcionan muy bien con los diccionarios. Para serializar y deserializar objetos JSON, se puede usar Python «__dict__». Existe el __dict__ en cualquier objeto de Python, que es un diccionario utilizado para almacenar los atributos (de escritura) de un objeto. Podemos usar eso para trabajar con JSON, y eso funciona bien.
Código: 

Python3

import json
 
 
class GFG_User(object):
    def __init__(self, first_name: str, last_name: str):
        self.first_name = first_name
        self.last_name = last_name
         
user = GFG_User(first_name="Jake", last_name="Doyle")
json_data = json.dumps(user.__dict__)
print(json_data)
print(GFG_User(**json.loads(json_data)))

Producción: 

{"first_name": "Jake", "last_name": "Doyle"} 
__main__.GFG_User object at 0x105ca7278

Nota: Los asteriscos dobles ** en la línea GFG_User(**json.load(json_data) pueden parecer confusos. Pero todo lo que hace es expandir el diccionario.

Objetos complejos

Ahora las cosas se complican cuando se trata de objetos JSON complejos, ya que nuestro truco «__dict__» ya no funciona.
Código: 

Python3

from typing import List
import json
 
 
class Student(object):
    def __init__(self, first_name: str, last_name: str):
        self.first_name = first_name
        self.last_name = last_name
 
 
class Team(object):
    def __init__(self, students: List[Student]):
        self.students = students
 
 
student1 = Student(first_name="Geeky", last_name="Guy")
student2 = Student(first_name="GFG", last_name="Rocks")
team = Team(students=[student1, student2])
json_data = json.dumps(team.__dict__, indent=4)
print(json_data)

Producción: 

TypeError: Object of type Student is not JSON serializable

Pero si observa la documentación de la función de volcado, verá que hay una configuración predeterminada que podemos usar. Simplemente reemplazando esta línea:

json_data = json.dumps(team.__dict__, indent=4)

Por esta línea:

json_data = json.dumps(team.__dict__, default=lambda o: o.__dict__, indent=4)

Y todo funciona ahora como antes. Ahora, echemos un vistazo a la deserialización:
Código: 

Python3

from typing import List
import json
 
 
class Student(object):
    def __init__(self, first_name: str, last_name: str):
        self.first_name = first_name
        self.last_name = last_name
 
 
class Team(object):
    def __init__(self, students: List[Student]):
        self.students = students
 
 
student1 = Student(first_name="Geeky", last_name="Guy")
student2 = Student(first_name="GFG", last_name="Rocks")
team = Team(students=[student1, student2])
 
# Serialization
json_data = json.dumps(team, default=lambda o: o.__dict__, indent=4)
print(json_data)
 
# Deserialization
decoded_team = Team(**json.loads(json_data))
print(decoded_team)

Producción: 

{
    "students": [
        {
            "first_name": "Geeky",
            "last_name": "Guy"
        },
        {
            "first_name": "GFG",
            "last_name": "Rocks"
        }
    ]
}
__main__.Team object at 0x105cd41d0

Publicación traducida automáticamente

Artículo escrito por samrat2825 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *