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
相关产品推荐
相关产品推荐

