Source code for haive.core.graph.common.serialization
"""Utilities for serialization and deserialization."""importjsonimportloggingimportuuidfromdatetimeimportdatetimefromenumimportEnumfromtypingimportAnylogger=logging.getLogger(__name__)
[docs]defensure_serializable(obj:Any)->Any:"""Ensure an object can be serialized to JSON. Args: obj: Object to make serializable Returns: JSON-serializable version of the object """ifobjisNoneorisinstance(obj,str|int|float|bool):returnobjifisinstance(obj,list|tuple|set):return[ensure_serializable(item)foriteminobj]ifisinstance(obj,dict):return{str(k):ensure_serializable(v)fork,vinobj.items()}ifisinstance(obj,Enum):returnobj.valueifisinstance(obj,datetime):returnobj.isoformat()ifisinstance(obj,uuid.UUID):returnstr(obj)# Handle Pydantic modelsifhasattr(obj,"model_dump"):# Pydantic v2returnensure_serializable(obj.model_dump())ifhasattr(obj,"dict"):# Pydantic v1returnensure_serializable(obj.dict())# Try to get __dict__ifhasattr(obj,"__dict__"):returnensure_serializable(obj.__dict__)# Last resort: convert to stringreturnstr(obj)
[docs]defto_json(obj:Any,**kwargs)->str:"""Convert an object to a JSON string. Args: obj: Object to serialize **kwargs: Additional arguments for json.dumps Returns: JSON string """serializable=ensure_serializable(obj)returnjson.dumps(serializable,**kwargs)
[docs]deffrom_json(json_str:str,target_cls:type|None=None)->Any:"""Convert a JSON string to an object. Args: json_str: JSON string to deserialize target_cls: Optional target class Returns: Deserialized object """data=json.loads(json_str)iftarget_cls:# Handle Pydantic modelsifhasattr(target_cls,"model_validate"):# Pydantic v2returntarget_cls.model_validate(data)ifhasattr(target_cls,"parse_obj"):# Pydantic v1returntarget_cls.parse_obj(data)# Handle simple classesifhasattr(target_cls,"__init__"):try:returntarget_cls(**data)except(TypeError,ValueError):passreturndata