JSON vs JSONL: 有什么区别?

全面了解 JSON 和 JSONL (JSON Lines) 格式、它们的区别以及何时使用各种格式的完整指南。

最后更新:2026年2月

快速对比

特性JSONJSONL (JSON Lines)
结构单个对象或数组每行一个 JSON 对象
文件扩展名.json.jsonl 或 .ndjson
解析方式必须解析整个文件可以逐行解析
流式处理困难原生支持
大文件处理内存密集型内存高效
可读性支持缩进格式化紧凑,每行一条记录
Schema 验证支持 JSON Schema每行独立 JSON Schema
追加数据必须重写整个文件简单追加新行即可

什么是 JSON?

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人类读写,也易于机器解析和生成。它基于 JavaScript 的一个子集,已成为 Web 上数据交换的事实标准。

JSON 文件包含一个单独的 JSON 值——通常是一个对象或数组。要访问其中的任何数据,必须将整个文件作为一个整体进行解析。

JSON 示例
[
  {"name": "Alice", "age": 30, "city": "New York"},
  {"name": "Bob", "age": 25, "city": "London"},
  {"name": "Charlie", "age": 35, "city": "Tokyo"}
]

什么是 JSONL (JSON Lines)?

JSONL (JSON Lines),也称为 Newline Delimited JSON (NDJSON),是一种文本格式,其中每行是一个有效的 JSON 对象。行之间用换行符 (\n) 分隔。与标准 JSON 不同,数据周围没有包裹的数组或对象。

JSONL 文件中的每一行都是独立的,可以单独解析。这使得 JSONL 非常适合流式数据、日志文件和处理大型数据集,无需将所有内容加载到内存中。

JSONL 示例
{"name": "Alice", "age": 30, "city": "New York"}
{"name": "Bob", "age": 25, "city": "London"}
{"name": "Charlie", "age": 35, "city": "Tokyo"}

JSON 和 JSONL 的关键区别

1. 文件格式与结构

JSON

JSON 将所有数据包装在一个对象或数组中。整个文件必须语法正确——末尾缺少一个括号就会导致整个文件无效。

JSONL

JSONL 每行存储一个 JSON 对象。每行都是独立的——如果某一行有错误,其他行仍然可以正常解析。

2. 解析与内存使用

JSON

JSON 需要一次性加载和解析整个文件。一个 1GB 的 JSON 文件大约需要 1GB+ 的内存来解析。

JSONL

JSONL 可以逐行读取和解析(流式处理)。即使是 10GB 的 JSONL 文件,也可以通过逐行读取以最小的内存处理。

3. 流式处理与实时数据

JSON

JSON 不是为流式处理设计的。您无法在整个文件或响应接收并解析完成之前开始处理数据。

JSONL

JSONL 非常适合流式处理。每行一收到就可以立即处理,非常适合实时数据流、日志和服务器发送事件。

4. 追加与写入数据

JSON

向 JSON 数组追加数据需要读取整个文件、解析、添加新元素,然后重写整个文件。

JSONL

向 JSONL 文件追加数据只需在末尾添加一行新内容。无需读取或修改现有数据。这是 O(1) vs JSON 的 O(n)。

5. 可读性

JSON

JSON 支持缩进格式化,非常适合配置文件和 API 响应的可读性。

JSONL

JSONL 设计上是紧凑的——每行一条记录。它为机器处理优化,而不是人类阅读,但单行可以格式化。

何时使用 JSON vs JSONL

JSON使用 JSON 的场景:
  • 配置文件
  • REST API 请求/响应体
  • 存储小型结构化数据(10MB 以下)
  • 数据需要可读性和可编辑性
  • 嵌套的层次化数据结构
  • 浏览器端数据交换
JSONL使用 JSONL 的场景:
  • 处理大型数据集(100MB+)
  • 实时流式数据
  • 写入日志文件和事件数据
  • 训练机器学习模型(OpenAI、Hugging Face)
  • ETL 管道和数据处理
  • 频繁追加数据
  • 使用 Unix 工具处理数据(grep、awk、sed)

常见使用场景

机器学习与 AI

JSONL

JSONL 是 ML 训练数据的标准格式。OpenAI 使用 JSONL 进行微调数据集,许多 ML 框架期望 JSONL 输入。每行代表一个训练示例。

应用日志

JSONL

服务器日志、应用事件和审计跟踪自然适合 JSONL。每个事件写为单行,便于追加、用 grep 搜索和用流式工具处理。

Web API 与配置

JSON

REST API 通常使用 JSON 作为请求和响应体。配置文件 (.json) 使用 JSON 存储可读的、嵌套对象的结构化设置。

大数据与分析

JSONL

数据管道、ETL 流程和分析工具使用 JSONL 处理大量数据。每条记录可以独立处理,支持并行处理和 MapReduce 模式。

代码示例

在 JavaScript 中读取 JSON
// 读取 JSON - 必须加载整个文件
const data = JSON.parse(fs.readFileSync('data.json', 'utf8'));

// 访问数据
data.forEach(item => {
  console.log(item.name);
});
在 JavaScript 中读取 JSONL
// 读取 JSONL - 逐行流式处理
import { createReadStream } from 'fs';
import { createInterface } from 'readline';

const rl = createInterface({
  input: createReadStream('data.jsonl')
});

for await (const line of rl) {
  const item = JSON.parse(line);
  console.log(item.name);
}
JSON 转换为 JSONL
// JSON 数组转 JSONL
const jsonArray = JSON.parse(fs.readFileSync('data.json', 'utf8'));
const jsonl = jsonArray
  .map(item => JSON.stringify(item))
  .join('\n');
fs.writeFileSync('data.jsonl', jsonl);
JSONL 转换为 JSON
// JSONL 转 JSON 数组
const lines = fs.readFileSync('data.jsonl', 'utf8')
  .split('\n')
  .filter(line => line.trim());
const jsonArray = lines.map(line => JSON.parse(line));
fs.writeFileSync('data.json', JSON.stringify(jsonArray, null, 2));

试试我们的 JSONL 查看器

在浏览器中即时查看和编辑高达 1GB 的 JSONL 文件。无需上传,无需注册。

常见问题

JSON vs JSONL: 有什么区别?完整指南