讲师中心 微信公众号
AI工具推荐 视频效率加速

Flask如何接收前端复杂的JSON嵌套数据_Python结合Marshmallow序列化

落强吖_4125

落强吖_4125

发布时间:2026-04-08 10:16:06

|

228人浏览过

|

来源于php中文网

原创

Flask接收嵌套JSON时request.get_json()返回None,主因是前端未设Content-Type: application/json或发送表单格式;需前端显式设置header,后端加form兜底;Marshmallow中用data_key映射键名与字段名差异;嵌套列表须用fields.List(fields.Nested(Schema))而非Nested(many=True);错误信息需通过ValidationError.normalized_messages()获取嵌套路径。

flask如何接收前端复杂的json嵌套数据_python结合marshmallow序列化

Flask接收嵌套JSON时request.get_json()返回None怎么办

常见原因是前端没设Content-Type: application/json,或者发的是表单格式(application/x-www-form-urlencoded)但后端硬用get_json()。Flask默认只对application/json解析JSON,其他类型会返回None。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 前端确保fetch或axios中显式设置headers: {'Content-Type': 'application/json'}
  • 后端加兜底判断:
    data = request.get_json()
    if data is None:
        # 尝试从form读(兼容部分调试场景)
        data = request.form.to_dict()
        # 注意:form不支持嵌套,仅作临时 fallback,不可用于真正嵌套结构
  • 开发期用curl验证:
    curl -X POST http://localhost:5000/api/data \
      -H "Content-Type: application/json" \
      -d '{"user": {"name": "Alice", "profile": {"age": 30, "tags": ["dev", "python"]}}}'

用Marshmallow定义嵌套Schema时字段名和JSON键不一致怎么处理

比如JSON里是user_profile,但Python变量想叫profile,直接写profile = fields.Dict()会导致反序列化失败——因为Marshmallow默认按字段名匹配键名。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 用data_key参数映射输入键名:
    class UserProfileSchema(Schema):
        age = fields.Integer(data_key="user_age")
        tags = fields.List(fields.String(), data_key="user_tags")
    <p>class UserSchema(Schema):
    name = fields.String(required=True)
    profile = fields.Nested(UserProfileSchema, data_key="user_profile")
  • data_key只影响输入/输出键名,不影响内部字段访问;序列化后仍按data_key输出,如需保持原键名输出,加dump_only=True或改用attribute
  • 避免在嵌套Schema里混用data_key和attribute,容易绕晕;统一用data_key控制JSON侧,用字段名控制Python侧

嵌套列表数据(如[{“id”:1},{“id”:2}])反序列化失败的典型原因

错误现象:传{"items": [{"id": 1}, {"id": 2}]},但schema.load(data)报Invalid type. Expected dict, but got list.——这通常是因为fields.List(fields.Nested(...))写错了位置。

Galileo python sdk
Galileo python sdk

Galileo AI 平台 Python SDK 完整参考,用于评估、监控和保护 GenAI 应用,适用于构建 Python 应用。

下载

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 嵌套列表必须用fields.List(fields.Nested(InnerSchema)),不能写成fields.Nested(InnerSchema, many=True)(后者是错的,many=True属于Nested的参数,不是字段类型)
  • 正确写法示例:
    class ItemSchema(Schema):
        id = fields.Integer()
    <p>class PayloadSchema(Schema):
    items = fields.List(fields.Nested(ItemSchema), required=True)
  • 如果列表项本身可能为null,加allow_none=True到fields.Nested里,而不是外层List
  • 性能注意:深层嵌套+大列表时,fields.Nested开销明显;若只需校验结构、不依赖Marshmallow的高级特性,可考虑用fields.Dict()配合手动校验

验证失败时如何让错误信息包含嵌套路径(比如“items[1].id is required”)

默认schema.validate(data)返回的错误字典是扁平的,嵌套字段报错只显示{"id": ["Missing data for required field."]},无法定位到具体第几个item。

实操建议:

立即学习“Python免费学习笔记(深入)”;

  • 启用error_store机制:调用schema.load(data, unknown=EXCLUDE)而非validate,它返回带完整路径的ValidationError异常
  • 捕获后用exc.normalized_messages()获取嵌套路径格式错误:
    try:
        result = schema.load(data)
    except ValidationError as exc:
        print(exc.normalized_messages())
        # 输出:{'items': {1: {'id': ['Missing data for required field.']}}}
  • 生产环境别直接返回原始normalized_messages()给前端(含内部结构),建议封装一层,把{1: {...}}转成["items[1].id is required"]字符串列表

嵌套JSON + Marshmallow的坑多数出在“以为字段名=键名”“列表写法记混”“错误路径不清晰”这三处。越早用curl测原始请求,越少被前端框架的默认行为干扰。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2363

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

5083

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6170

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

5698

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

803

2024.05.22

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1691

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4244

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1689

2023.07.31

Kratos框架HTTP与gRPC服务开发教程
Kratos框架HTTP与gRPC服务开发教程

本专题围绕Kratos框架双协议服务开发,涵盖HTTP路由与处理器编写、参数获取、gRPC服务实现与客户端调用、metadata上下文传递、encoding编解码注册、统一响应封装、超时控制与流式响应实现方法。

0

2026.10.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn