如何不打开200MB单行JSON文件将其转换为多行格式?
解决大单行JSON美化问题(无需打开编辑器)
这种200MB级别的单行JSON,直接用编辑器打开卡爆太正常了,而且你遇到的json.tool报错,核心原因大概率是你的文件不是单个合法的JSON实体——比如是多个JSON对象直接拼接在一行(像{"id":1}{"id":2}这种格式),而python -m json.tool只支持解析单个JSON对象/数组,所以会报"Extra data"错误,解析失败后自然生成空文件。
下面给你几个高效的替代方案,全是命令行操作,完全不用打开文件:
方案1:用jq工具(最推荐,高效处理大文件)
jq是专门处理JSON的命令行神器,对大文件友好,支持流式处理,不会把整个200MB文件一股脑加载到内存里。
安装jq:
- Linux:用系统包管理器,比如
apt install jq(Debian/Ubuntu)或yum install jq(CentOS) - macOS:用Homebrew,
brew install jq - Windows:直接下载官方二进制文件放到系统PATH里就行
- Linux:用系统包管理器,比如
使用命令:
- 如果你的文件是多个JSON对象拼接在一行:
jq -s '.' myjsonfile.json > pretty.json-s参数会把所有输入的JSON实体打包成一个数组,再美化输出。 - 如果确认是单个合法JSON对象/数组(之前报错可能是偶发问题):
jq '.' myjsonfile.json > pretty.json
- 如果你的文件是多个JSON对象拼接在一行:
方案2:Python流式处理脚本(无需额外安装工具)
如果不想装新工具,可以用这个Python脚本,它会分块读取文件,避免一次性加载200MB内容到内存,还能处理单行多个JSON的情况:
创建一个pretty_json.py文件,内容如下:
import json import sys def process_large_json(input_path, output_path): with open(input_path, 'r', encoding='utf-8') as infile, open(output_path, 'w', encoding='utf-8') as outfile: buffer = "" # 按1MB块读取,避免内存溢出 while chunk := infile.read(1024 * 1024): buffer += chunk # 尝试解析buffer中的JSON,成功就写入并清空buffer while True: try: # 从buffer开头解析JSON obj, idx = json.JSONDecoder().raw_decode(buffer) json.dump(obj, outfile, indent=2) outfile.write('\n') buffer = buffer[idx:].lstrip() # 去掉已解析的部分,清理空白 except json.JSONDecodeError: # 解析失败,继续读取下一块 break # 处理最后剩余的buffer if buffer.strip(): try: obj = json.loads(buffer) json.dump(obj, outfile, indent=2) except json.JSONDecodeError as e: print(f"警告:最后一段内容解析失败,错误位置:{e.pos},内容预览:{buffer[:100]}...", file=sys.stderr) if __name__ == "__main__": if len(sys.argv) != 3: print("用法:python pretty_json.py <输入JSON文件> <输出美化文件>", file=sys.stderr) sys.exit(1) process_large_json(sys.argv[1], sys.argv[2])
然后运行命令:
python pretty_json.py myjsonfile.json pretty.json
方案3:用yq工具(兼容JSON/YAML)
yq是jq的超集,支持处理YAML和JSON,用法和jq类似:
yq -P '.' myjsonfile.json > pretty.json
-P参数表示"pretty print",专门用来美化输出。
为什么之前的json.tool失败?
python -m json.tool的设计是处理单个完整的JSON对象或数组,如果你的文件是多个JSON直接拼接(没有用数组包裹),它就会识别为"多余数据",解析失败后自然不会生成内容。而上面的方案都能处理这种多JSON的情况。
内容的提问来源于stack exchange,提问作者Achintha Ihalage
相关产品推荐
相关产品推荐

