Skip to content

Instantly share code, notes, and snippets.

@lmmx
Created August 15, 2024 22:04
Show Gist options
  • Save lmmx/6b4d043aec2df6da02e861acfc780c5f to your computer and use it in GitHub Desktop.
Save lmmx/6b4d043aec2df6da02e861acfc780c5f to your computer and use it in GitHub Desktop.
A simple type validation approach to JSON key path modelling
from pathlib import Path
from pydantic import BaseModel, BeforeValidator, TypeAdapter
from typing import Annotated, Union
RoutePart = Union[int, str]
rp_ta = TypeAdapter(RoutePart)
def split_route(route: str) -> list[RoutePart]:
match route:
case str():
return list(map(rp_ta.validate_strings, route.split(".")))
case list():
return route case _:
raise ValueError(f"Invalid route: {route}")
Route = Annotated[list[RoutePart], BeforeValidator(split_route)]
class Router(BaseModel, validate_default=True):
field_1: Route = "a.aa.aaa.0"
field_2: Route = "a.aa.aaa.1"
field_3: Route = "b"
router = Router()
json_str = Path("data.json").read_text()
@lmmx
Copy link
Author

lmmx commented Aug 15, 2024

>>> router
Router(field_1=['a', 'aa', 'aaa', 0], field_2=['a', 'aa', 'aaa', 1], field_3=['b'])

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment