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

FastAPI中如何接收嵌套JSON输入?遇Unprocessable Entity错误

解决FastAPI+Pydantic处理嵌套JSON的422错误及自定义提取函数问题

一、先解决「Unprocessable Entity」错误

这个422错误的核心是传入的JSON结构和你的Pydantic请求模型不匹配,FastAPI依赖Pydantic自动校验请求数据,结构不符会直接返回校验失败。你需要先定义和输入JSON完全对应的嵌套Pydantic模型:

1. 定义匹配的Pydantic模型

from pydantic import BaseModel
from typing import List

# 嵌套子模型
class Identifier(BaseModel):
    type: str
    value: str

class Recipient(BaseModel):
    identifiers: List[Identifier]

class TemplateField(BaseModel):
    id: str
    value: str

# 顶层请求模型
class PublicationRequest(BaseModel):
    publicationSystem: str
    deliveryMethod: str
    recipients: List[Recipient]
    templateId: str
    templateFields: List[TemplateField]

2. 编写FastAPI路由

用上述模型作为请求参数,FastAPI会自动完成数据解析和校验:

from fastapi import FastAPI

app = FastAPI()

@app.post("/submit-publication")
async def handle_publication(request: PublicationRequest):
    # 直接通过request对象获取结构化数据,如request.publicationSystem、request.recipients等
    # 如需扁平处理数据,调用修复后的提取函数即可
    flat_data = extract_values_fixed(request.dict())
    return {"status": "success", "data": flat_data}

只要传入的JSON结构正确,就不会再返回422错误。

二、修复自定义嵌套JSON提取函数

你原来的extract_values函数存在两个致命问题:

  • 使用可变默认参数lst=[], keys=[]:Python中可变默认参数在函数定义时创建,多次调用会复用同一个列表,导致数据污染。
  • 键名处理逻辑丢失层级信息:嵌套的同名键(如type)会被覆盖,最终只保留最后一个值。

修复后的函数(保留完整层级路径作为键,避免冲突):

def extract_values_fixed(dct, parent_key=''):
    items = []
    if isinstance(dct, dict):
        for k, v in dct.items():
            # 拼接父键与当前键,保留层级关系
            new_key = f"{parent_key}_{k}" if parent_key else k
            items.extend(extract_values_fixed(v, new_key))
    elif isinstance(dct, list):
        # 给列表项添加索引,区分同层级不同元素
        for idx, v in enumerate(dct):
            new_key = f"{parent_key}_{idx}" if parent_key else str(idx)
            items.extend(extract_values_fixed(v, new_key))
    else:
        # 非容器类型,直接添加键值对
        items.append((parent_key, dct))
    # 转换为字典返回
    return dict(items)

用该函数处理你提供的JSON,会得到无键冲突的扁平结构:

{
    "publicationSystem": "xyz",
    "deliveryMethod": "Queued",
    "recipients_0_identifiers_0_type": "CustomerId",
    "recipients_0_identifiers_0_value": "123456783",
    "templateId": "123453",
    "templateFields_0_id": "fuhu",
    "templateFields_0_value": "Jojo"
}

内容的提问来源于stack exchange,提问作者Gopal Joshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:46:59