使用pydantic模型验证并修复perplexity api json响应错误,包括:一、用json-repair预处理语法错误;二、启用strict模式校验字段;三、适配非标结构;四、自定义model_config容错;五、依http头动态分流解析。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您调用Perplexity API后获得的JSON响应存在格式错误或结构不一致,导致无法直接反序列化为预期对象,则可能是由于大模型输出未严格遵循JSON语法规范,或字段缺失、类型错位所致。以下是使用Pydantic模型进行结构化数据验证并修复JSON返回格式错误的多种方法:
一、预处理JSON字符串:使用json-repair自动修复语法缺陷
该方法适用于原始响应中存在缺失引号、单引号混用、括号不闭合等基础语法错误的情形。json-repair库可安全地将非标准JSON字符串转换为合法JSON,且不改变语义。
1、安装json-repair库:
pip install json-repair
2、在请求后立即对原始响应文本进行修复:
from json_repair import repair_json
raw_response = response.text # 假设response为requests.Response对象
fixed_json_str = repair_json(raw_response)
3、将修复后的字符串传入Pydantic模型解析:
try:
model_instance = MyResponseModel.model_validate_json(fixed_json_str)
except ValidationError as e:
print(Pydantic验证失败:字段类型或缺失不符合模型定义)
二、定义严格Pydantic v2模型并启用strict模式校验
该方法通过Pydantic的model_validate_json()配合strict=True参数,强制要求输入JSON必须精确匹配模型字段名、类型及嵌套结构,从而在解析阶段暴露格式偏差,避免隐式类型转换掩盖问题。
1、声明Pydantic模型,显式标注required字段与类型约束:
from pydantic import BaseModel, Field
from typing import List, Optional
class PerplexityAnswer(BaseModel):
query: str = Field(..., min_length=1)
answer: str = Field(..., min_length=1)
sources: List[str] = Field(default_factory=list)
2、使用strict模式解析修复后的JSON:
try:
data = PerplexityAnswer.model_validate_json(fixed_json_str, strict=True)
except Exception as e:
print(strict模式捕获到字段缺失或类型不匹配:请检查原始响应是否含多余字段或空值未处理)
三、添加中间层JSON Schema兼容性适配器
该方法用于应对Perplexity API实际返回结构与文档描述不一致的场景(如将数组返回为对象、嵌套层级偏移),通过字典级键映射与类型归一化,使非标JSON可被Pydantic模型接纳。
1、编写适配函数,将常见歧义结构标准化:
def adapt_perplexity_json(raw: dict) -> dict:
if isinstance(raw.get("sources"), str):
raw["sources"] = [raw["sources"]] if raw["sources"] else []
if "answer_text" in raw and "answer" not in raw:
raw["answer"] = raw.pop("answer_text")
return raw
2、在调用model_validate时先执行适配:
adapted = adapt_perplexity_json(json.loads(fixed_json_str))
try:
instance = PerplexityAnswer.model_validate(adapted)
except ValidationError as ve:
print(适配后仍验证失败:需检查字段逻辑映射是否覆盖全部API变体)
四、启用Pydantic模型的model_config自定义错误处理
该方法通过重写model_config中的extra和validate_default行为,允许模型容忍部分字段缺失或冗余,并在验证失败时返回结构化错误详情,便于定位具体哪一字段触发异常。
1、在模型中配置宽松策略与错误钩子:
class PerplexityAnswer(BaseModel):
query: str
answer: str
sources: List[str] = []
model_config = {
"extra": "ignore",
"validate_default": True,
"strict": False
}
2、捕获并解析验证错误细节:
try:
instance = PerplexityAnswer.model_validate_json(fixed_json_str)
except ValidationError as e:
for error in e.errors():
print(f"字段 {error['loc'][0]} 错误类型: {error['type']}")
print(关键提示:'missing'表示必填字段未提供,'string_type'表示值非字符串类型)
五、结合HTTP响应头与Content-Type动态选择解析路径
该方法用于应对Perplexity API偶发返回非JSON内容(如HTML错误页、纯文本提示)的情形,通过检查响应头Content-Type和状态码,提前分流处理,避免无效JSON解析。
1、判断响应是否应为JSON:
if response.status_code == 200 and "application/json" in response.headers.get("content-type", ""):
raw_text = response.text.strip()
if raw_text.startswith("{") or raw_text.startswith("["):
# 进入json-repair + Pydantic流程
else:
print(响应体非JSON起始字符:可能返回了服务端HTML降级页)
else:
print(非200状态或Content-Type非application/json:跳过JSON解析)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











