Akshay66777's picture
AgentScope Gradio chat app — ZeroGPU-ready
9792ea7 verified
Raw
History Blame Contribute Delete
1.78 kB
# -*- coding: utf-8 -*-
"""Serialize objects to JSON string."""
import datetime
import enum
import inspect
import json
from dataclasses import is_dataclass
from typing import Any
from pydantic import BaseModel
from ...message import Msg
def _to_serializable(
obj: Any,
) -> Any:
"""Convert an object to a JSON serializable type.
Args:
obj (`Any`):
The object to be converted to JSON serializable.
Returns:
`Any`:
The converted JSON serializable object
"""
# Handle primitive types first
if isinstance(obj, (str, int, bool, float, type(None))):
res = obj
elif isinstance(obj, (list, tuple, set, frozenset)):
res = [_to_serializable(x) for x in obj]
elif isinstance(obj, dict):
res = {str(key): _to_serializable(val) for (key, val) in obj.items()}
elif isinstance(obj, (Msg, BaseModel)) or is_dataclass(obj):
res = repr(obj)
elif inspect.isclass(obj) and issubclass(obj, BaseModel):
res = repr(obj)
elif isinstance(obj, (datetime.date, datetime.datetime, datetime.time)):
res = obj.isoformat()
elif isinstance(obj, datetime.timedelta):
res = obj.total_seconds()
elif isinstance(obj, enum.Enum):
res = _to_serializable(obj.value)
else:
res = str(obj)
return res
def _serialize_to_str(value: Any) -> str:
"""Serialize input value to JSON string.
Args:
value (`Any`):
The input value
Returns:
`str`:
JSON serialized string of the input value
"""
try:
return json.dumps(value, ensure_ascii=False)
except TypeError:
return json.dumps(
_to_serializable(value),
ensure_ascii=False,
)