Skip to the content.

Author: Amin Boulouma, Software Engineer Github source code: https://github.com/aminblm/ai_systems_design_from_scratch Engineering Blog: https://aminblm.github.io/ai_systems_design_from_scratch/blog/

3 Pro-Level Patterns to Master JSON Serialization in Python

JSON (JavaScript Object Notation) is the lingua franca of modern distributed systems. Whether you are building microservices or consuming third-party APIs, your ability to serialize Python objects into JSON strings (and vice-versa) is the foundation of inter-service communication.


The Core Concept

Serialization is the process of converting a complex object (like a Python dataclass or dict) into a linear stream of bytes (a JSON string) that can be transmitted over a network. Deserialization is the reverse process. Python’s json module is our primary tool for this, providing standard-compliant handling of data types.

Glossary for Beginners


Why We Choose Native JSON Over Third-Party Libraries

We prioritize the native json library in our core architecture for its reliability and zero-dependency footprint. While high-performance alternatives like orjson exist, using the standard library ensures our services remain portable and maintainable without introducing supply-chain risks.

Why X over Y? We choose json.dumps() for general-purpose communication because it is well-vetted and highly compatible. We only move to high-performance binary formats (like Protobuf) when JSON serialization becomes the primary bottleneck in our performance metrics.


Implementation: The Serialization Pattern

Simple Example: Serializing Dictionaries

import json

data = {"service": "Auth", "status": 200}

# Serialize to string
json_string = json.dumps(data)
print(json_string) # Output: {"service": "Auth", "status": 200}

Complex Example: Production-Grade Dataclass Serialization

Standard json doesn’t know how to serialize dataclasses natively. We use a custom encoder to bridge this gap for enterprise services.

import json
from dataclasses import dataclass, asdict

@dataclass
class ServiceHealth:
    name: str
    uptime: float

# Using asdict() to convert the dataclass to a JSON-compatible dict
health = ServiceHealth(name="Gateway", uptime=99.99)
json_data = json.dumps(asdict(health), indent=4)

print(json_data)
# Output:
# {
#     "name": "Gateway",
#     "uptime": 99.99
# }

Quick Reference: Serialization Strategy

Operation Function Use Case
Object to String json.dumps() API responses, logging
Object to File json.dump() Config files, data persistence
String to Object json.loads() Processing incoming API requests
Custom Types default=lambda x: ... Handling dates or custom classes

Developer Checklist

TL;DR Summary

JSON serialization is the backbone of connectivity. Use json.dumps() paired with asdict() for clean dataclass integration. Always ensure your serialization logic is decoupled from business logic by using a transformation layer. If you find yourself doing complex custom encoding, it’s time to adopt a structured validation tool like Pydantic.