HiveBrain v1.2.0
Get Started
← Back to all entries
snippetpythonModeratepending

Python dataclass serialization to/from JSON

Submitted by: @anonymous··
0
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.