JSON Lines(JSONL)⇔ JSON 数组 互相转换
在每行一个 JSON 对象的 JSON Lines 格式与普通 JSON 数组之间互相转换,方便查看机器学习数据集和日志输出。
什么是 JSON Lines(JSONL)
JSON Lines 是每行写一个 JSON 对象的格式。整份文件本身并非 JSON,因此不需要处理结尾逗号,只要追加一行就能新增数据。应用日志、机器学习训练数据、导入 BigQuery 或 Elasticsearch 等「一笔一笔流动」的用途广泛采用此格式,副档名通常是 `.jsonl` 或 `.ndjson`。
本工具可在 JSON Lines 与 JSON 数组之间双向转换。从 JSONL 转为数组时会跳过空行,若某行不是有效的 JSON 则以错误告知。反向转换时,最外层必须是数组,否则会失败。所有处理都在浏览器内完成,日志或训练数据这类不想外送的内容也能安心处理。
转换 JSONL 与 JSON 数组的步骤
- 选择转换方向 从 JSONL 转为 JSON 数组,或从 JSON 数组转为 JSONL。
- 粘贴数据 JSONL 请以一行一对象,数组请直接贴上以 `[` 开头的文字。
- 出现错误时检查该行 讯息会指出哪一行无法解析。结尾多余的逗号或未闭合的引号是常见原因。
- 复制结果 可直接存成文件,或交给流程中的下一个工具。
用好本工具的小技巧
- JSON Lines(JSONL)是每行排列一个独立 JSON 对象的格式,广泛用于 OpenAI 微调数据集以及 Elasticsearch/Logstash 的日志输出等场景。
- 在"JSONL → JSON 数组"模式下,每一行都必须是可单独解析的 JSON 对象,空行会被自动跳过。
- 在"JSON 数组 → JSONL"模式下,整个输入必须是一个 JSON 数组(`[ ... ]`),数组中的每个元素会作为一行 JSONL 输出。
- 将大型日志文件从 JSONL 转换为 JSON 数组后,用 `jq` 命令或各编程语言的标准 JSON 数组解析器处理起来会更加方便。
这些场景下会用到
把日志交给分析工具
以一行一笔输出的应用日志,汇整成 JSON 数组后,就能被以数组为前提的工具与函数库直接使用。
整理机器学习的训练数据
训练数据常以 JSONL 发布,而前处理脚本却期待数组,本工具可作为两者的桥梁。
导入 BigQuery 或 Elasticsearch
两者都接受换行分隔的 JSON 作为输入格式,可将手边的 JSON 数组转成可导入的形式。
让大型 JSON 能逐行处理
维持数组就必须整份读完才能开始处理;转成 JSONL 后便能逐行依序处理。
JSON Lines 的相关术语
- JSON Lines(JSONL)
- 每行写一个 JSON 值的格式。**整份文件作为 JSON 并不合法**(因为多个值并列)。优点在于每一行都能独立读取。
- NDJSON
- Newline Delimited JSON 的缩写,与 JSON Lines 几乎是同一件事。副档名 `.ndjson` 即源自此称呼。
- 串流处理
- 不先读入整份数据,而是从抵达的开头依序处理的方式。JSONL 适合这种方式,两者因此经常搭配。
- 最外层
- JSON 最外侧的值。要转为 JSONL 时此处必须是数组 `[...]`,若是对象 `{...}` 则无法转换。
- 空行的处理
- 依 JSONL 的规格,空行不具意义。本工具会跳过空行,因此档尾多出换行也能正常转换。
常见问题
闲话 ― 为什么会诞生"一行一条记录"这种格式
JSON Lines(也称 JSONL)这种格式诞生的背景,是因为普通的 JSON 数组存在一个限制:在把整体读入内存并解析完毕之前,无法取出哪怕一条中间数据。如果试图用 JSON 数组处理多达数百万行的日志数据或机器学习训练数据集,就必须把整个文件展开到内存中,对于超大文件来说,这会带来内存不足和解析耗时激增的问题。
JSON Lines 用"一行 = 一个完整的 JSON 对象"这样简单的约束解决了这个问题。由于可以一边逐行读取文件一边随即解析,无需把整个文件读入内存,因此与流式处理、并行处理非常契合。这种设计理念也与 Unix 系统传统的"一行一条记录"文本处理文化(`grep`、`awk`、`sed` 等命令都按行工作)高度亲和,可以直接嵌入现有的命令行工具链,这在实用层面也是很大的优势。
如今它已被广泛采用为 AI、机器学习领域的数据集分发格式,大语言模型的训练数据以及用于微调的提示/回复对,以 JSON Lines 格式分发的情况已相当普遍。