如何用Pydantic strict=False将结构中的UUID强制转换为字符串?
解决含UUID字典转JSON可序列化结构的方法
以下几种方法可以实现将包含UUID对象的字典转换为仅含JSON可序列化值的结构(无需直接转为JSON字符串):
方法一:自定义递归处理函数
手动遍历数据结构,遇到UUID对象就转换为字符串,同时处理嵌套的字典、列表等结构:
import uuid from typing import Any def convert_to_json_serializable(data: Any) -> Any: if isinstance(data, uuid.UUID): return str(data) elif isinstance(data, dict): return {k: convert_to_json_serializable(v) for k, v in data.items()} elif isinstance(data, (list, tuple)): return type(data)(convert_to_json_serializable(item) for item in data) else: return data # 测试示例 raw_dict = { "id": uuid.uuid4(), "nested": {"sub_id": uuid.uuid4()}, "list_ids": [uuid.uuid4(), uuid.uuid4()] } serializable_dict = convert_to_json_serializable(raw_dict)
方法二:Pydantic BaseModel + model_dump(mode='json')
利用Pydantic 2.x的mode='json'参数,让model_dump采用和model_dump_json一致的序列化规则,自动将UUID转为字符串:
import uuid from pydantic import BaseModel, UUID4 from typing import Dict, List class DataModel(BaseModel): id: UUID4 nested: Dict[str, UUID4] list_ids: List[UUID4] # 测试示例 raw_data = { "id": uuid.uuid4(), "nested": {"sub_id": uuid.uuid4()}, "list_ids": [uuid.uuid4(), uuid.uuid4()] } model = DataModel(**raw_data) # 用mode='json'触发JSON序列化规则 serializable_dict = model.model_dump(mode='json')
方法三:TypeAdapter + dump_python(mode='json')
如果不需要定义BaseModel,可以用TypeAdapter直接处理目标类型,同样通过mode='json'参数实现转换:
import uuid from pydantic import TypeAdapter, UUID4 from typing import Dict, List # 定义目标数据类型 TargetType = Dict[str, UUID4 | Dict[str, UUID4] | List[UUID4]] adapter = TypeAdapter(TargetType) # 测试示例 raw_data = { "id": uuid.uuid4(), "nested": {"sub_id": uuid.uuid4()}, "list_ids": [uuid.uuid4(), uuid.uuid4()] } serializable_dict = adapter.dump_python(raw_data, mode='json')
内容的提问来源于stack exchange,提问作者Charles Duffy
相关产品推荐
相关产品推荐

