jsonl 文件格式

JSONLJSON Lines 的缩写,代表按行分隔的 JSON 格式(Line-delimited JSON)。

简单来说,它是一种专门为处理大规模或流式数据而设计的纯文本文件格式。

它和标准 .json 的核心区别

  1. 标准 .json 格式:
    整个文件是一个巨大的 JSON 结构(通常是一个数组或对象),所有的记录都包在一对 [ ] 中,记录之间用逗号分隔。
[{"id": 1, "status": "init", "timestamp": "2026-07-29T10:00:00Z"},{"id": 2, "status": "running", "timestamp": "2026-07-29T10:01:00Z"}
]
  1. .jsonl 格式:
    没有外层的数组括号,没有记录间的逗号,每一行都是一个完全独立且有效的 JSON 对象
{"id": 1, "status": "init", "timestamp": "2026-07-29T10:00:00Z"}
{"id": 2, "status": "running", "timestamp": "2026-07-29T10:01:00Z"}

为什么日志文件(如 projection_log.jsonl)喜欢用这种格式?

比如文件名叫 projection_log.jsonl,这通常是系统运行日志、事件流(Event Sourcing)或数据投影(Projection)的记录文件。使用这种格式有几个非常明显的优势:

  • 增量写入(高效日志追加):
    在标准 JSON 中,追加一条新记录必须先读取整个文件,去掉结尾的 ],写入逗号和新数据,再补上 ];而 JSONL 只需直接在文件末尾追加一行字符串(\n),非常适合作为 Log 文件。
  • 逐行读取(极大节省内存):
    对于动辄几 GB 的日志文件,读取标准 JSON 必须把整个文件一次性载入内存;而 JSONL 可以做到按行流式读取(Stream Read),处理多大体积的文件都不用担心内存溢出(OOM)。
  • 容错性强:
    如果程序中断导致最后一条日志没有写完整,标准 JSON 整个文件都会损坏导致无法解析;而 JSONL 只会损坏最后一行,前面的所有行依然是合法且可被解析的 JSON。

如何在代码中快速解析?

在各种编程语言中解析 JSONL 都非常简单,只需逐行读取并解析即可:

Python 示例:

import json# 逐行读取解析,无需把几 GB 的文件一次性装入内存
with open('projection_log.jsonl', 'r', encoding='utf-8') as f:for line in f:log_entry = json.loads(line)print(log_entry['status'])

Node.js 示例:

const readline = require('readline');
const fs = require('fs');const rl = readline.createInterface({input: fs.createReadStream('projection_log.jsonl'),crlfDelay: Infinity
});rl.on('line', (line) => {const logEntry = JSON.parse(line);console.log(logEntry);
});