toolgarden.xyz
EN
JSONLJSON LinesNDJSON日志AI 训练数据

JSONL 是什么格式?示例、对比和适用场景

JSONL 把每一行都作为一个独立 JSON 值,特别适合日志、AI 训练数据、大规模导入导出和流式处理。

ToolGarden 推荐的工具优先在浏览器本地运行,文件和文本不必上传到服务器,适合更注重安全隐私的日常处理。

发布于 2026年9月21日约 7 分钟阅读作者 ToolGarden

JSONL,也常叫 JSON Lines 或 NDJSON,是一种“每行一个 JSON”的文本格式。对于日志、AI 训练数据、大规模数据导入导出、流式处理,JSONL 往往比普通 JSON 更合适。

普通 JSON 很适合表达一个完整对象、配置文件或 API 响应;JSONL 更像一条一条追加的记录流。它仍然使用 JSON 语法,但文件整体不是一个大数组,而是由多行独立 JSON 值组成。

JSONL 的基本规则

  • 一行就是一条完整 JSON 记录,最常见的是一个对象。
  • 每一行必须能被单独 JSON.parse;行与行之间不需要逗号。
  • 文件末尾可以有换行,处理时通常按行读取。
  • 不要把多行格式化后的对象直接放进 JSONL,因为那会破坏“一行一条记录”的约定。

一个 JSONL 示例

{"timestamp":"2026-09-21T10:00:00Z","level":"info","message":"job started","jobId":"import-42"}
{"timestamp":"2026-09-21T10:00:02Z","level":"warn","message":"retrying row","row":128}
{"timestamp":"2026-09-21T10:00:05Z","level":"info","message":"job finished","records":1000000}

上面三行分别是三条记录。你可以只读取第一行、追加第四行,或者从中间某一行继续处理,而不需要把整个文件一次性解析成内存里的数组。

和普通 JSON 数组有什么区别?

[
  {
    "timestamp": "2026-09-21T10:00:00Z",
    "level": "info",
    "message": "job started",
    "jobId": "import-42"
  },
  {
    "timestamp": "2026-09-21T10:00:02Z",
    "level": "warn",
    "message": "retrying row",
    "row": 128
  }
]
对比项普通 JSONJSONL
文件结构通常是一个对象或数组多行独立 JSON 记录
追加数据需要维护数组逗号和结尾括号直接追加新的一行
读取方式常常一次性解析完整文件可以逐行读取、逐条处理
错误影响一个语法错误可能让整个文件解析失败通常只影响出错的那一行
适合规模小到中等配置、接口响应、文档数据日志、事件、训练样本、批量导入导出

为什么日志更适合 JSONL?

日志天然是一条一条产生的。服务运行时不断写入新事件,如果使用普通 JSON 数组,就要反复处理逗号、数组结尾和文件完整性;使用 JSONL,只要把每条日志序列化成一行并追加即可。

这也让后续处理更简单:命令行工具、日志采集器、消息队列消费者和数据仓库导入任务都可以按行消费,不必等待整个文件完成。

为什么 AI 训练数据常用 JSONL?

AI 训练或微调数据通常由大量样本组成,每个样本可以独立验证、过滤、打乱、切分。JSONL 正好符合这种“样本级”处理方式。

{"messages":[{"role":"user","content":"Summarize this log entry"},{"role":"assistant","content":"The import job started successfully."}],"source":"logs"}
{"messages":[{"role":"user","content":"Classify the ticket urgency"},{"role":"assistant","content":"high"}],"source":"support"}

在这种结构里,一行就是一个训练样本。数据团队可以对单行做 schema 检查、去重、抽样和质量标注,也可以把多个 JSONL 文件合并成更大的数据集。

适用场景

  • 日志:应用日志、审计日志、埋点事件、系统指标快照。
  • AI 训练数据:对话样本、分类样本、指令微调数据、标注记录。
  • 大规模导入导出:数据库导出、搜索索引重建、数据仓库批量加载。
  • 流式处理:消息队列消费、实时 ETL、长连接返回、分块下载。
  • 数据清洗流水线:逐行过滤、映射、聚合、抽样,而不是一次性加载全量文件。

什么时候仍然应该用普通 JSON?

如果数据本身就是一个有层级关系的文档,例如配置文件、页面状态、单个 API 响应或需要整体事务语义的数据,普通 JSON 更直观。JSONL 的优势在于“很多条彼此独立的记录”,不是替代所有 JSON。

小结

JSONL 的核心价值是把大文件拆成可独立处理的记录。它牺牲了普通 JSON 数组的整体结构感,换来更好的追加写入、逐行读取、错误隔离和流式处理能力。

常见问题

Q.JSONL 和 NDJSON 是一回事吗?

实际使用中二者几乎指同一种格式:每行一个 JSON 值。JSONL 更常作为文件格式名称出现,NDJSON 强调 newline-delimited JSON,也就是用换行分隔的 JSON。

Q.JSONL 文件可以格式化成多行吗?

不建议。JSONL 的关键约定是一行一条记录。如果把单条对象格式化成多行,按行读取的程序会把半个对象当成一条记录,导致解析失败。

Q.JSONL 的文件扩展名是什么?

常见扩展名包括 .jsonl 和 .ndjson。团队内部最好统一一种,并在导入导出文档中写清楚编码、换行和 schema 约定。