如何用Pydantic将字符串格式的配置转为字典类型?
解决方案
要处理AWS返回的字符串格式configuration字段,在Pydantic模型里自动转成字典并解析为嵌套模型,核心思路是用**验证器(Validator)**在数据解析前完成字符串到字典的转换。以下是具体实现:
1. Pydantic v2 实现(推荐)
Pydantic v2使用BeforeValidator装饰器定义前置验证逻辑,先把字符串转成字典再解析为嵌套模型:
import json from pydantic import BaseModel, BeforeValidator # 定义字符串转JSON的验证器函数 def parse_json_string(value): if isinstance(value, str): try: return json.loads(value) except json.JSONDecodeError: # 解析失败时可根据需求返回默认值或抛出异常 return {} return value # 嵌套的配置模型 class LambdaConfig(BaseModel): memory_size: int runtime: str handler: str # 主Lambda模型 class LambdaModel(BaseModel): function_name: str # 用BeforeValidator处理configuration字段的字符串转字典 configuration: LambdaConfig = BeforeValidator(parse_json_string)
测试示例
模拟AWS返回的原始数据,直接解析即可:
# 模拟AWS返回的结构,configuration是JSON字符串 aws_raw_data = { "function_name": "test-lambda", "configuration": '{"memory_size": 512, "runtime": "python3.11", "handler": "lambda_function.lambda_handler"}' } # 解析为Pydantic模型 lambda_obj = LambdaModel(**aws_raw_data) print(lambda_obj.configuration.memory_size) # 输出: 512 print(type(lambda_obj.configuration)) # 输出: <class '__main__.LambdaConfig'>
2. Pydantic v1 实现
如果还在使用Pydantic v1,用validator装饰器并设置pre=True来实现前置处理:
import json from pydantic import BaseModel, validator class LambdaConfig(BaseModel): memory_size: int runtime: str handler: str class LambdaModel(BaseModel): function_name: str configuration: LambdaConfig @validator('configuration', pre=True) def parse_config_string(cls, value): if isinstance(value, str): return json.loads(value) return value
注意事项
- 如果
configuration字段可能为空字符串或无效JSON,可在验证器里添加容错逻辑(比如返回空字典或抛出ValueError)。 - 确保嵌套模型
LambdaConfig的字段和AWS返回的JSON结构完全匹配,避免解析失败。
内容的提问来源于stack exchange,提问作者flyerhawk
相关产品推荐
相关产品推荐

