Pydantic 2.x(通过 pydantic-settings)不再自动将 JSON 格式的环境变量字符串(如 ["a","b"])解析为 Python 列表,需显式启用 JSON 解析或调整字段映射方式;使用 alias 替代 env 并配合 json 类型转换可恢复兼容行为。
pydantic 2.x(通过 `pydantic-settings`)不再自动将 json 格式的环境变量字符串(如 `["a","b"]`)解析为 python 列表,需显式启用 json 解析或调整字段映射方式;使用 `alias` 替代 `env` 并配合 `json` 类型转换可恢复兼容行为。
在 Pydantic v1.x 中,BaseSettings 会尝试对环境变量值(如 MY_LIST=["a","b"])进行智能类型推断,自动将 JSON 格式的字符串反序列化为对应 Python 类型(如 list[str])。但自 v2.0 起,pydantic-settings 拆分为独立包,且默认关闭了对环境变量值的 JSON 解析——它严格按字段类型校验原始字符串输入,因此 ["a","b"] 被当作 str 传入,导致 list[str] 字段校验失败。
✅ 正确解决方案:使用 alias + json 类型转换
最简洁、推荐的做法是 移除 env="MY_LIST",改用 alias="MY_LIST",并确保 MY_LIST 的值为合法 JSON 字符串(.env 文件中保持 MY_LIST=["a","b"] 不变),同时启用 json 解析支持:
from pydantic_settings import BaseSettings
from pydantic import Field, Json
import os
import logging
import sys
class Settings(BaseSettings):
my_list: list[str] = Field(..., alias="MY_LIST") # ✅ 关键:用 alias 而非 env
class Config:
env_file = f'{os.environ.get("ENV", "dev")}.env'
env_file_encoding = 'utf-8'
env_prefix = f'{os.environ.get("ENV", "dev")}_'
extra = 'ignore'
# 或更显式地声明为 Json 类型(推荐用于复杂嵌套结构)
# my_list: Json[list[str]] = Field(..., alias="MY_LIST")
? 为什么 alias 有效?
alias="MY_LIST" 将字段 my_list 映射到环境变量名 MY_LIST,而 pydantic-settings 在解析 alias 绑定的环境变量时,会自动尝试 JSON 解析(前提是值为合法 JSON 字符串)。相比之下,env="MY_LIST" 是旧版语义,在 v2+ 中已被弃用且不触发 JSON 解析逻辑;此外,若 env_prefix 存在(如 DEV_),env="MY_LIST" 还可能与前缀冲突(例如实际查找 DEV_MY_LIST),进一步加剧问题。
? 其他可靠备选方案
方案 1:显式使用 Json 类型(语义最清晰)
from pydantic import Json
class Settings(BaseSettings):
my_list: Json[list[str]] = Field(..., alias="MY_LIST")
此时 .env 中仍写 MY_LIST=["a","b"],Pydantic 会强制调用 json.loads() 解析,类型安全更强,错误提示也更明确。
方案 2:自定义解析器(适用于非标准格式)
若 .env 中使用逗号分隔(如 MY_LIST=a,b),可配合 @field_validator:
from pydantic import field_validator
class Settings(BaseSettings):
my_list: list[str] = Field(..., alias="MY_LIST")
@field_validator('my_list', check_fields=False)
@classmethod
def parse_csv_list(cls, v):
if isinstance(v, str):
return [item.strip() for item in v.split(',')]
return v
⚠ 注意事项
- 确保 .env 中 JSON 格式严格合法:双引号、无尾逗号、无注释(例如 MY_LIST=["a","b"] ✅,MY_LIST=['a','b'] ❌)。
- env_prefix 仅影响 env 参数绑定的变量,不影响 alias ——这是 alias 能绕过前缀干扰的关键。
- 避免混用 env 和 alias;v2+ 文档已明确推荐统一使用 alias 进行环境变量映射。
✅ 总结
Pydantic v2.6+ 中恢复列表环境变量解析的核心是:用 alias="MY_LIST" 替代 env="MY_LIST",并保持 .env 值为标准 JSON 字符串。此举既兼容原有配置,又符合新版设计哲学——显式优于隐式,JSON 解析由字段映射机制自动触发,无需额外配置。升级后务必检查所有 env= 用法,统一迁移至 alias,即可平滑过渡。










