Skip to content

Custom Decoders (object_hook)

Use object_hook to transform JSON objects during deserialization.

Basic object_hook Usage

Transform JSON objects with a custom function.

import json
from datetime import datetime

def parse_date(obj):
    if 'date' in obj and isinstance(obj['date'], str):
        obj['date'] = datetime.fromisoformat(obj['date'])
    return obj

json_str = '{"event": "Meeting", "date": "2024-12-25T14:30:00"}'
data = json.loads(json_str, object_hook=parse_date)
print(data)
print(f"Date type: {type(data['date'])}")
{'event': 'Meeting', 'date': datetime.datetime(2024, 12, 25, 14, 30)}
Date type: <class 'datetime.datetime'>

Creating Custom Classes from JSON

Convert JSON objects to custom Python classes.

import json
from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int

def user_decoder(obj):
    if 'name' in obj and 'age' in obj:
        return User(obj['name'], obj['age'])
    return obj

json_str = '{"name": "Alice", "age": 30}'
user = json.loads(json_str, object_hook=user_decoder)
print(user)
print(f"Type: {type(user)}")
User(name='Alice', age=30)
Type: <class '__main__.User'>