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

夏杰同学_2786

夏杰同学_2786

2026-04-27

667人浏览

原创

必须用 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”——这两处最容易花半天才定位到。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.08.07

2075

5

json是什么
json是什么

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

2023.08.23

3082

1

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

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

2023.10.13

1036

3

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

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

2025.09.10

3519

7

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

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

2023.06.29

2605

3

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

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

2023.08.14

3841

10

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

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

2023.08.31

2851

3

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

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

2023.09.05

927

5

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

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2527

5

热门下载

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

精品课程

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

共101课时 | 20.9万人学习

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

共39课时 | 4.8万人学习