Source code for ds_resource_plugin_py_lib.libs.utils.json_default
"""
**File:** ``json_default.py``
**Region:** ``ds_resource_plugin_py_lib/libs/utils``
Description
-----------
JSON serialization helpers for values that are not natively JSON-encodable.
Example
-------
.. code-block:: python
from datetime import datetime
import json
from ds_resource_plugin_py_lib.libs.utils.json_default import json_default
payload = json.dumps({"created_at": datetime(2024, 3, 15, 10, 30)}, default=json_default)
"""
from __future__ import annotations
from datetime import date, datetime, time
from decimal import Decimal
from enum import Enum
from typing import Any
from uuid import UUID
[docs]
def json_default(value: Any) -> Any:
"""
``default`` callback for :func:`json.dumps`.
Maps common Python types (for example ``datetime``) to JSON-serializable
values. Scalar-like objects with a callable ``.item()`` (for example numpy
scalars) are unwrapped before encoding. Unknown types raise
:class:`TypeError`, matching stdlib behavior.
``bytes`` and ``bytearray`` are intentionally not converted: JSON has no binary
type, and decoding bytes as text would silently change the data.
"""
if isinstance(value, (datetime, date, time)):
return value.isoformat()
if isinstance(value, Decimal):
return str(value)
if isinstance(value, UUID):
return str(value)
if isinstance(value, Enum):
return value.value
if isinstance(value, (set, frozenset)):
return list(value)
item = getattr(value, "item", None)
if callable(item):
native = item()
try:
return json_default(native)
except TypeError:
return native
raise TypeError(f"Object of type {type(value).__name__} is not JSON serializable")