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