35 lines
962 B
Python
35 lines
962 B
Python
import json
|
|
from typing import Any
|
|
from datetime import datetime
|
|
from typing_extensions import override
|
|
|
|
import pydantic
|
|
|
|
from .._compat import model_dump
|
|
|
|
|
|
def openapi_dumps(obj: Any) -> bytes:
|
|
"""
|
|
Serialize an object to UTF-8 encoded JSON bytes.
|
|
|
|
Extends the standard json.dumps with support for additional types
|
|
commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
|
|
"""
|
|
return json.dumps(
|
|
obj,
|
|
cls=_CustomEncoder,
|
|
# Uses the same defaults as httpx's JSON serialization
|
|
ensure_ascii=False,
|
|
separators=(",", ":"),
|
|
allow_nan=False,
|
|
).encode()
|
|
|
|
|
|
class _CustomEncoder(json.JSONEncoder):
|
|
@override
|
|
def default(self, o: Any) -> Any:
|
|
if isinstance(o, datetime):
|
|
return o.isoformat()
|
|
if isinstance(o, pydantic.BaseModel):
|
|
return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
|
|
return super().default(o)
|