PYTHON

Serialize Custom Python Objects to JSON-Friendly Dictionaries

Convert complex Python objects, such as dataclasses or custom classes, into JSON-serializable dictionaries for seamless API responses or data storage in web applications.

from dataclasses import asdict, is_dataclass
from datetime import datetime, date
from typing import Any

def serialize_object_to_dict(obj: Any) -> Any:
    """ Recursively converts an object (especially dataclasses) into a JSON-serializable dictionary. """
    if is_dataclass(obj):
        # Convert dataclass to dict
        data = asdict(obj)
        return {k: serialize_object_to_dict(v) for k, v in data.items()}
    elif isinstance(obj, (datetime, date)):
        # Convert datetime/date objects to ISO 8601 string
        return obj.isoformat()
    elif isinstance(obj, dict):
        # Recursively process dictionary values
        return {k: serialize_object_to_dict(v) for k, v in obj.items()}
    elif isinstance(obj, list):
        # Recursively process list items
        return [serialize_object_to_dict(item) for item in obj]
    else:
        # Return primitive types as is
        return obj

# --- Example Usage with Dataclass (from previous snippet) ---
from dataclasses import dataclass, field
from typing import List, Optional

@dataclass
class UserProfile:
    username: str
    email: str
    age: Optional[int] = None
    created_at: datetime = field(default_factory=datetime.now)
    roles: List[str] = field(default_factory=list)

@dataclass
class APIResponse:
    status_code: int
    message: str
    data: Optional[UserProfile] = None

user_profile = UserProfile("coder_guy", "[email protected]", age=35, roles=["developer"])
api_response_obj = APIResponse(200, "Profile data retrieved", user_profile)

# Convert to JSON-friendly dictionary
json_friendly_dict = serialize_object_to_dict(api_response_obj)

import json
print(json.dumps(json_friendly_dict, indent=2))

# Output will be a valid JSON string, with datetime converted:
# {
#   "status_code": 200,
#   "message": "Profile data retrieved",
#   "data": {
#     "username": "coder_guy",
#     "email": "[email protected]",
#     "age": 35,
#     "created_at": "2023-10-27T10:30:00.123456", (example date/time)
#     "roles": [
#       "developer"
#     ]
#   }
# }
How it works: When returning data from a Python web backend (e.g., Flask, FastAPI) to a client, complex Python objects like `dataclasses`, `datetime` objects, or custom classes are not directly JSON serializable. This function provides a recursive solution to convert such objects into a standard Python dictionary structure that the `json` module can then serialize. It specifically handles `dataclasses` using `asdict`, converts `datetime` and `date` objects to ISO 8601 strings, and recursively processes nested dictionaries and lists, ensuring all data types are compatible for JSON output.

Need help integrating this into your project?

Our team of expert developers can help you build your custom application from scratch.

Hire DigitalCodeLabs