A Python library for automatically generating Pydantic v2 models from JSON Schema definitions.
- Converts JSON Schema to Pydantic v2 models
- Supports complex schema features including:
- References ($ref) with circular reference detection
- Combiners (allOf, anyOf, oneOf) with proper type discrimination
- Type constraints and validations
- Array and object validations
- Format validations (email, uri, uuid, date-time)
- Full type hinting support
- Clean, simple API
pip install json-schema-to-pydantic- Clone the repository
- Install development dependencies:
# Using uv (recommended)
uv pip install -e ".[dev]"
# Or using pip
pip install -e ".[dev]"- Run tests:
pytestfrom json_schema_to_pydantic import create_model
# Define your JSON Schema
schema = {
"title": "User",
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string", "format": "email"},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name", "email"]
}
# Generate your Pydantic model
UserModel = create_model(schema)
# Use the model
user = UserModel(
name="John Doe",
email="[email protected]",
age=30
)
# Example with relaxed validation
RelaxedModel = create_model(
{
"type": "object",
"properties": {
"tags": {"type": "array"}, # Array without items schema
"metadata": {} # Field without type
}
},
allow_undefined_array_items=True, # Allows arrays without items schema
allow_undefined_type=True # Allows fields without type (defaults to Any)
)
relaxed_instance = RelaxedModel(
tags=[1, "two", True],
metadata={"custom": "data"}
)For more complex scenarios, you can use the PydanticModelBuilder directly:
from json_schema_to_pydantic import PydanticModelBuilder
builder = PydanticModelBuilder()
model = builder.create_pydantic_model(schema, root_schema)The library provides specific exceptions for different error cases:
from json_schema_to_pydantic import (
SchemaError, # Base class for all schema errors
TypeError, # Invalid or unsupported type
CombinerError, # Error in schema combiners
ReferenceError, # Error in schema references
)
try:
model = create_model(schema)
except TypeError as e:
print(f"Invalid type in schema: {e}")
except ReferenceError as e:
print(f"Invalid reference: {e}")See docs/features.md for detailed documentation of supported JSON Schema features.
- Fork the repository
- Create a new branch for your feature
- Make your changes
- Run tests and ensure they pass
- Submit a pull request
This project is licensed under the terms of the license included in the repository.