snippetpythonModeratepending
Python dataclass serialization to/from JSON
Viewed 0 times
dataclassjsonserializationasdictpydanticdacite
Problem
Need to convert dataclasses to JSON and back, handling nested objects, dates, and enums.
Solution
Multiple approaches for dataclass serialization:
from dataclasses import dataclass, asdict, field
from datetime import datetime
from enum import Enum
import json
class Status(Enum):
ACTIVE = 'active'
INACTIVE = 'inactive'
@dataclass
class User:
name: str
email: str
status: Status = Status.ACTIVE
created_at: datetime = field(default_factory=datetime.now)
tags: list[str] = field(default_factory=list)
# Method 1: Custom encoder
class DataclassEncoder(json.JSONEncoder):
def default(self, o):
if hasattr(o, '__dataclass_fields__'):
return asdict(o)
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, Enum):
return o.value
return super().default(o)
user = User('Alice', 'alice@example.com')
json_str = json.dumps(user, cls=DataclassEncoder, indent=2)
# Method 2: dacite for deserialization
from dacite import from_dict, Config
data = json.loads(json_str)
user = from_dict(User, data, config=Config(
type_hooks={datetime: datetime.fromisoformat}
))
# Method 3: Pydantic (most robust)
from pydantic import BaseModel
class UserModel(BaseModel):
name: str
email: str
status: Status = Status.ACTIVE
created_at: datetime = field(default_factory=datetime.now)
tags: list[str] = []
user = UserModel(name='Alice', email='alice@example.com')
json_str = user.model_dump_json()
user = UserModel.model_validate_json(json_str)Why
Dataclasses don't include serialization by default. asdict() handles basic cases but not dates, enums, or deserialization.
Context
Python APIs and data processing needing JSON serialization
Revisions (0)
No revisions yet.