当日志、事件流、数据导出和 AI 数据集超出一个整洁 JSON 文档的规模时,JSONL 就会出现。它每一行都是一个完整 JSON 值,文件可以追加、拆分、流式读取,也可以按记录逐条处理。

打开 ZeroTool JSONL 转换器 →

本文讲清 JSONL、NDJSON、双向转换、逐行校验、命令行等价操作,以及常见的数据文件损坏原因。

快速答案

任务推荐做法
JSONL 转常规 JSON逐行解析,再把记录包装成 JSON 数组。
JSON 数组转 JSONL用紧凑的 JSON.stringify() 序列化每个数组项,每项一行。
校验 JSONL 文件独立解析每一行,并报告失败行号。
从混乱文件导出部分数据只转换有效行,再检查报告出的错误行。

需要浏览器端快速检查时,用 JSONL 转换器。需要可重复脚本时,用 jq

JSONL 是什么

JSONL 是 JSON Lines 的缩写。NDJSON 表示 newline-delimited JSON。日常开发里,这两个名字通常描述同一种实用形态:

{"id":1,"event":"signup","user":"alice"}
{"id":2,"event":"purchase","user":"bob","amount":29.99}
{"id":3,"event":"cancel","user":"carol"}

每一行本身都是有效 JSON。整个文件由一系列 JSON 值按换行分隔组成。这种形态适合:

  • 追加写入的应用日志
  • 每一行都是结构化记录的分析导出
  • 搜索索引流水线
  • 机器学习和 AI 训练数据集
  • 一次到达一条记录的流式 API

JSON 数组把记录集中放进一个文档。JSONL 把每条记录作为独立行保存。这种按行组织的结构让 JSONL 很适合流式处理和命令行工具。

JSONL 转 JSON 数组

浏览器端转换的核心逻辑很直接:

const jsonl = `{"id":1,"event":"signup"}
{"id":2,"event":"purchase"}`;

const array = jsonl
  .split("\n")
  .filter((line) => line.trim())
  .map((line) => JSON.parse(line));

console.log(JSON.stringify(array, null, 2));

输出:

[
  {
    "id": 1,
    "event": "signup"
  },
  {
    "id": 2,
    "event": "purchase"
  }
]

ZeroTool 转换器在这个基础上加了更稳的工作流:统计总行数、有效行、空行和解析错误。某一行解析失败时,问题面板会显示行号、解析消息和原始行预览。

JSON 数组转 JSONL

从一个数组开始:

[
  { "id": 1, "event": "signup" },
  { "id": 2, "event": "purchase" }
]

把每一项变成一行紧凑 JSON 字符串:

const jsonl = array.map((item) => JSON.stringify(item)).join("\n");

输出:

{"id":1,"event":"signup"}
{"id":2,"event":"purchase"}

紧凑输出很关键,因为每一行都要保持一条完整记录。把对象格式化成多行会把单条记录拆成多个片段。

校验逐行错误

大多数 JSONL 错误都发生在局部。一个错误行可能夹在大型文件中,周围记录仍然正常:

{"id":1,"event":"signup"}
{"id":2,"event":"purchase",}
{"id":3,"event":"cancel"}

第二行有尾随逗号。逐行校验器能立刻报告 第 2 行,常规 JSON 格式化器会把整个文件视为一个解析失败的文档。

实用校验检查:

  • 独立解析每一个非空行
  • 单独统计空行
  • 为失败行保留短预览
  • 审查后导出已成功解析的有效记录
  • 保持有效记录的原始顺序

命令行等价操作

使用 jq,把 JSON 数组转成 JSONL:

jq -c '.[]' data.json > data.jsonl

把 JSONL 转回 JSON 数组:

jq -s '.' data.jsonl > data.json

逐行校验 JSONL 文件:

awk '{ print NR ":" $0 }' data.jsonl | while IFS=: read -r line value; do
  echo "$value" | jq empty >/dev/null 2>&1 || echo "Invalid JSON on line $line"
done

浏览器工具适合一次性检查。Shell 版本适合 CI 任务和可重复导入流水线。

最佳实践

做法价值
一行一条记录流式工具可以逐条处理记录。
每条记录使用紧凑 JSON多行格式化对象会破坏逐行格式。
保存为 UTF-8 文本文件能在编辑器、终端和 API 之间稳定流转。
导入前先校验错误行会在进入数据库或模型训练任务前暴露。
保持稳定字段下游 CSV、SQL 和 schema 工具更容易使用。

转换完成后,可以把 JSON 数组送到 JSON 格式化工具 检查结构,送到 JSON 转 CSV 转换器 进入表格流程,或用 JSON Diff 对比两份导出。