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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:07:18