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

怎么导出多重嵌套的JSON格式_复杂关联数据提取

夏杰同学_2786

夏杰同学_2786

发布时间:2026-04-27 10:55:20

|

667人浏览过

|

来源于php中文网

原创

必须用 json.dumps() 或 json.dump() 导出合法 JSON;嵌套结构需确保顶层为 dict/list,排除 set/datetime/自定义类等非标类型,避免循环引用和内存溢出。

用 json.dumps() 处理嵌套字典和列表,别直接 print

直接 print(data) 看起来像 json,其实只是 python 对象的字符串表示,缺引号、乱转义、不换行,根本不是合法 json。导出必须走 json.dumps() 或 json.dump()。

常见错误现象:TypeError: Object of type set is not JSON serializable —— 说明数据里混了 set、datetime、自定义类等非标准类型。

  • 先检查数据结构:用 type(data) 和 isinstance(data, (dict, list)) 确认顶层是 dict/list
  • 遇到 set,提前转成 list;遇到 datetime,用 isoformat() 转字符串
  • 简单兜底方案:传 default=str 参数,但会把数字也变成字符串,慎用
  • 示例:json.dumps(data, indent=2, ensure_ascii=False) —— indent 控制缩进,ensure_ascii=False 保留中文

关联数据有循环引用?用自定义 JSONEncoder

当 A 字段引用 B,B 又引用回 A(比如 ORM 模型间双向关系),json.dumps() 会报 RecursionError。这不是数据“太深”,而是存在引用环。

使用场景:Django Model 实例、SQLAlchemy 对象、手写的嵌套类实例。

  • 不要手动删字段(容易漏或破坏结构),改用继承 json.JSONEncoder
  • 在 default 方法里识别对象类型,只序列化需要的字段,跳过反向关系属性(如 _state、user_set)
  • 避免在 default 里调用 vars(obj) 或 obj.__dict__,可能暴露出内部属性
  • 示例:json.dumps(obj, cls=CustomEncoder, indent=2),其中 CustomEncoder 重写了 default

导出大文件时内存爆掉?改用 json.dump() 流式写入

json.dumps() 把整个结构转成一个大字符串再写入磁盘,100MB+ 的嵌套数据很容易触发 MemoryError。这时候必须绕过字符串中间态。

Wjs Uploading Video
Wjs Uploading Video

将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。

下载

性能影响:对 50MB 数据,dumps + write 可能占用 3 倍内存;dump 直接写文件,内存增量几乎恒定。

  • 打开文件用 encoding='utf-8',否则 Windows 上可能写乱码
  • json.dump(data, f, indent=2, ensure_ascii=False) —— 注意参数顺序,f 是文件对象,不是路径字符串
  • 别用 open(path, 'w').write(json.dumps(...)),这是典型内存陷阱
  • 如果数据是生成器(比如逐条查数据库),不能直接 dump,得先聚合为 list/dict,或改用 ijson 库流式解析

Django/Flask 返回 JSON 时字段丢失?检查序列化前的数据净化

后端接口返回空对象、字段全 null、或抛 TypeError,大概率不是 JSON 模块问题,而是视图层拿出来的数据没清理干净。

常见错误现象:AttributeError: 'NoneType' object has no attribute 'id' 在序列化过程中出现 —— 说明关联字段是 None,但代码仍尝试取 .id。

  • Django 中避免直接传 model_instance.__dict__,它包含 _state 等私有字段
  • 用 model_to_dict() 时加 fields 参数限定范围,或用 serializers.serialize('json', [...]) 更安全
  • Flask 中若用 jsonify(),确保传入的是纯 dict/list,不要传 model 实例或 query 结果集
  • 关键点:JSON 序列化前的最后一层数据,必须是「可预测结构 + 无运行时依赖」,比如不能含 lambda、未求值的 QuerySet、带方法的实例
复杂嵌套本身不难处理,真正卡住人的,往往是某一层悄悄混进了不可序列化的对象,或者以为“能 print 就能 json.dumps”——这两处最容易花半天才定位到。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

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

WorkBuddy

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

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

火山引擎

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

DeepSeek

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2115

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3182

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1076

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3639

2025.09.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2665

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

3901

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2951

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

947

2023.09.05

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

0

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习

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

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