You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:31:08