Tengo dos formas de representar el objeto Python por json.dumps()
Primero:
person = { "name": "John", "age": 30, "city": "New York" }Segundo:
class Person: def _init_(self, name, age, city): self.name = name self.age = age self.city = city person = Person("John", 30, "New York") Luego probé p1 = json.dumps(person) , la segunda forma diría it's not JSON serializable .
Entonces, básicamente para Python, json.dumps solo funciona para objetos integrados como el objeto dict.
Si está preguntando sobre Vanilla Python, la serialización podría hacerse de esta manera:
import json class Person: def __init__(self, name, age, city): self.name = name self.age = age self.city = city def to_json(self): return json.dumps(self, default=lambda o: o.__dict__) person = Person("John", 30, "New York") print(person.to_json()) Entonces, solo estamos convirtiendo un objeto en un dictado usando el atributo __dict__ .
Pero si necesita algo más sofisticado, es posible que necesite DRF (Django REST Framework) o pydantic . Un ejemplo de cómo se podría hacer con DRF:
from rest_framework import serializers from rest_framework.serializers import Serializer class Person: def __init__(self, name, age, city): self.name = name self.age = age self.city = city class PersonSerializer(Serializer): name = serializers.CharField() age = serializers.IntegerField() city = serializers.CharField() def create(self, validated_data): return Person(**validated_data) person = Person("John", 30, "New York") print(PersonSerializer(person).data)De esta manera usted tiene un control mucho mejor sobre él. Ver documentos .
Sí, el módulo json solo sabe cómo serializar ciertos tipos integrados. Una manera fácil de trabajar con clases que tienen "campos" es el módulo de dataclasses de datos.
Ejemplo:
from dataclasses import dataclass, asdict import json @dataclass class Person: name: str age: int city: str person = Person("John", 30, "New York") print(json.dumps(asdict(person))) La función asdict() convierte la instancia de clase de datos en un dict que json puede serializar.
Con Python 3.6+, puede usar clases de datos en Python junto con la función auxiliar asdict para convertir una instancia de clase de datos en un objeto dict de Python.
Nota: Para la versión 3.6, necesitará un backport para el módulo de
dataclassesde datos, ya que solo se convirtió en una función integrada de Python a partir de la versión 3.7.
import json from dataclasses import dataclass, asdict @dataclass class Person: name: str age: int city: str person = Person("John", 30, "New York") person_dict = asdict(person) json_string = json.dumps(person_dict, indent=2) print(json_string)Afuera:
{ "name": "John", "age": 30, "city": "New York" }Si tiene un caso de uso más complejo o necesita (des) serializar un modelo de clase de datos anidado, consultaría una biblioteca externa como el asistente de clase de datos que admite ese caso de uso en particular.