HOWTO · Python
Cómo serializar un objeto de clase de Python en JSON
Este tutorial enseña sobre la serialización en Python y demuestra la serialización JSON de clases de Python.
En esta página
Una instancia personalizada de Python no puede pasarse directamente al codificador json estándar. Conviértala primero en valores compatibles con JSON y luego utilice json.dumps() cuando necesite texto JSON. Para escribir ese texto en un objeto similar a un archivo, utilice en su lugar json.dump().
Serialización en Python
La serialización convierte los datos en una representación que puede almacenarse o transferirse y reconstruirse más tarde. JSON admite objetos, matrices, cadenas, números, booleanos y null; en Python estos corresponden a diccionarios, listas, cadenas, números, booleanos y None. Una instancia de una clase personalizada no tiene una representación JSON automática, por lo que debe decidir cuáles de sus atributos exponer y convertirlos en esos valores admitidos.
Hacer que una clase de Python sea serializable en JSON
El codificador JSON maneja los valores integrados de Python, incluidos los diccionarios y las listas anidados. Para una instancia personalizada, pase una función default a json.dumps() que convierta cada instancia encontrada en un diccionario. Esto también funciona para los objetos personalizados anidados, siempre que la conversión devuelva valores que el codificador pueda manejar.
Usar el método toJSON() para hacer serializable una clase JSON
toJSON() es un nombre de método ordinario elegido por el autor de la clase. El módulo json de Python no lo llama automáticamente. Una opción es utilizar el argumento default del codificador y hacer que el método devuelva el texto JSON:
Ejecute este ejemplo:
import json
class Pet:
def __init__(self, name):
self.name = name
class Person:
def __init__(self, name, age, pet):
self.name = name
self.age = age
self.pet = pet
def toJSON(self):
return json.dumps(self, default=lambda value: value.__dict__, sort_keys=True)
person = Person("Kelvin", 20, Pet("Brunno"))
print(person.toJSON())
Este ejemplo se proporciona como código ejecutable, pero no se dispone de ningún resultado de ejecución para él. Por tanto, su salida no se ha verificado aquí. La función de devolución de llamada default se aplica tanto a Person como al Pet anidado; si un atributo en sí no es compatible, añada también una regla de conversión para ese valor.
Envolver la serialización JSON en la clase
Una clase también puede hacerse cargo del paso de conversión y devolver un diccionario de valores compatibles con JSON. Luego pase ese diccionario a json.dumps(). Una dataclass es útil cuando sus campos ya describen los datos que se van a exponer:
from dataclasses import asdict, dataclass
import json
@dataclass
class Student:
id: int
name: str
def toJSON(self):
return asdict(self)
student = Student(id=1, name="Kelvin")
json_text = json.dumps(student.toJSON())
print(json_text)
Este ejemplo tampoco se ha ejecutado aquí. asdict() convierte los campos de la dataclass en un diccionario; json.dumps() devuelve entonces el texto JSON. Para la salida a un archivo, llame en su lugar a json.dump(student.toJSON(), file_object) con un objeto similar a un archivo abierto en lugar de imprimir la cadena devuelta. Ninguno de los dos enfoques hace serializables objetos arbitrarios anidados de Python a menos que esos valores también se conviertan.