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.