如何用Pydantic 2.6.1别名实现含Python关键字JSON的往返序列化?
Pydantic 2.6.1 实现含Python关键字别名的模型双向序列化/反序列化
问题场景
需要用Pydantic 2.6.1的别名功能,在生成JSON时使用Python关键字from作为字段名。当前序列化能正确生成带from别名的字典,但反序列化时触发ValidationError,提示from_str字段缺失。尝试过设置validation_alias但导致model_dump输出不符合预期,需解决模型与JSON的往返转换问题。
原代码及报错:
from pydantic import BaseModel, Field class TestModel(BaseModel): from_str: str = Field(serialization_alias="from") test_obj = TestModel(from_str="John") print("TestModel: ", test_obj) test_json = test_obj.model_dump(by_alias=True) print("Test JSON:", test_json) deserialized_obj = TestModel.model_validate(test_json) print("Deserialized: ", deserialized_obj)
报错信息:
pydantic_core._pydantic_core.ValidationError: 1 validation error for TestModel from_str Field required [type=missing, input_value={'from': 'John'}, input_type=dict]
解决方法
核心是给字段同时设置serialization_alias和validation_alias,让模型在序列化和反序列化时都能识别别名from。同时注意model_dump时需指定by_alias=True才能输出别名格式。
修改后的代码:
from pydantic import BaseModel, Field class TestModel(BaseModel): from_str: str = Field(serialization_alias="from", validation_alias="from") test_obj = TestModel(from_str="John") print("TestModel: ", test_obj) # 序列化:输出含别名from的JSON结构 test_json = test_obj.model_dump(by_alias=True) print("Test JSON:", test_json) # 输出: {'from': 'John'} # 反序列化:识别输入中的from字段映射到from_str deserialized_obj = TestModel.model_validate(test_json) print("Deserialized: ", deserialized_obj) # 输出: TestModel(from_str='John') # 验证反序列化后的对象序列化是否一致 assert deserialized_obj.model_dump(by_alias=True) == test_json
原理说明
serialization_alias="from":指定序列化(model_dump(by_alias=True))时,将from_str字段替换为from输出。validation_alias="from":指定反序列化(model_validate)时,将输入中的from字段映射到模型的from_str字段。- 若仅设置
validation_alias但未加by_alias=True调用model_dump,默认会输出原字段名from_str,这就是之前出现model_dump问题的原因,需确保序列化时显式指定by_alias=True。
内容的提问来源于stack exchange,提问作者MJC
相关产品推荐
相关产品推荐

