0

0

json.tool 模块如何安全美化超大 JSON 文件(分块读取)

冰川箭仙

冰川箭仙

发布时间:2026-01-21 20:16:02

|

155人浏览过

|

来源于php中文网

原创

json.tool无法分块处理大JSON因其底层依赖json.load()一次性加载全文,易内存溢出;安全方案是用json模块流式解析数组元素或借助ijson实现GB级文件的边读边格式化。

json.tool 模块如何安全美化超大 json 文件(分块读取)

直接用 json.tool 命令行美化超大 JSON 文件会内存溢出,因为它默认一次性加载整个文件。安全处理的关键是**不依赖 json.tool 模块本身做分块**(它不支持流式解析),而是改用标准库json 模块配合流式读取逻辑,手动实现“类美化”输出。

为什么 json.tool 不能分块处理

json.tool 是一个简单的命令行封装,底层调用 json.load(),必须将完整字符串或文件对象传入,无法中断或分段解析。对几百 MB 以上的 JSON(尤其是单行无换行的 minified JSON),极易触发 MemoryError 或长时间卡死。

安全替代方案:用 json 模块流式解析 + 分块缩进写入

适用于两种常见大 JSON 场景:

  • 大型 JSON 数组(如日志列表、导出数据):逐个解析数组元素,边读边格式化输出
  • 单个巨型 JSON 对象(较少见但存在):需借助 ijson 等第三方流式解析器(json 标准库不原生支持)

推荐优先处理「JSON 数组」场景(占大文件 90%+),示例代码如下:

吐槽大师
吐槽大师

吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

下载
import json
import sys
<p>def pretty_print_large_json_array(input_path, output_path, indent=2):
with open(input_path, 'r', encoding='utf-8') as f_in, \
open(output_path, 'w', encoding='utf-8') as f_out:</p><h1>跳过开头 '[' 和可能的空白</h1><pre class='brush:python;toolbar:false;'>    char = f_in.read(1)
    while char.isspace() or char == '[':
        char = f_in.read(1)
    f_in.seek(f_in.tell() - 1)  # 回退一个字符,准备读第一个对象

    f_out.write('[\n')

    first_item = True
    while True:
        try:
            # 尝试解析一个 JSON 值(对象/数组/基本类型)
            obj = json.load(f_in)
            if not first_item:
                f_out.write(',\n')
            else:
                first_item = False
            json.dump(obj, f_out, indent=indent, ensure_ascii=False)
        except json.JSONDecodeError as e:
            # 遇到解析失败,说明已到结尾(或格式错误)
            if "Expecting value" in str(e) and f_in.tell() >= f_in.seek(0, 2):
                break
            raise e
        except StopIteration:
            break

    f_out.write('\n]\n')

使用方式(命令行脚本风格)

if len(sys.argv) != 3: print("用法: python pretty_large.py <输入.json> <输出.json>") else: pretty_print_large_json_array(sys.argv[1], sys.argv[2])

更鲁棒的做法:用 ijson 流式解析(推荐用于真正超大文件)

ijson 可以边读边解析,不加载全文到内存,适合 GB 级 JSON。安装:pip install ijson

  • 对 JSON 数组:用 ijson.parse()ijson.items(f, 'item') 迭代每个元素
  • 对嵌套结构:用路径表达式(如 'logs.item.timestamp')按需提取字段
  • 美化写入仍用 json.dump(..., indent=2),但每次只处理一个子对象

示例片段:

import ijson
import json
<p>def stream_pretty_array(input_path, output_path):
with open(input_path, 'rb') as f_in, \
open(output_path, 'w', encoding='utf-8') as f_out:
f_out.write('[\n')
parser = ijson.parse(f_in)
items = ijson.items(f_in, 'item')  # 重置文件指针后重新打开流
f_in.close()</p><pre class='brush:python;toolbar:false;'>    first = True
    for item in items:
        if not first:
            f_out.write(',\n')
        else:
            first = False
        json.dump(item, f_out, indent=2, ensure_ascii=False)
    f_out.write('\n]\n')

注意事项与避坑点

  • 确保输入文件编码为 UTF-8,否则 json.load 可能报错;用 encoding='utf-8' 显式指定
  • 不要尝试用 readline() 分割 JSON —— JSON 本身可跨行,单行也可能含换行符(如字符串值中)
  • 若文件是 JSON Lines(每行一个 JSON),则直接按行读取 + json.loads(line) 最简单高效
  • 生产环境建议加异常日志和进度提示(如每处理 1000 项打印一次)

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

457

2023.08.07

json是什么
json是什么

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

549

2023.08.23

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

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

337

2023.10.13

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

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

82

2025.09.10

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

373

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

437

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

803

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

371

2025.07.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号