JSONL vs NDJSON:有什么区别?
完整对比 JSONL (JSON Lines) 和 NDJSON (Newline Delimited JSON) ——两个名字几乎代表同一种格式,但有一些值得了解的细微差别。
最后更新:2026年2月
快速对比:JSONL vs NDJSON
| 特性 | JSONL (JSON Lines) | NDJSON |
|---|---|---|
| 全称 | JSON Lines | Newline Delimited JSON |
| 文件扩展名 | .jsonl | .ndjson |
| 规范 | jsonlines.org (非正式) | github.com/ndjson/ndjson-spec (非正式规范) |
| 起源 | 社区约定,由数据科学工具推广 | 由 Chris Olah、Thorsten Ball 等人提出 |
| 行分隔符 | \n (换行符) | \n (换行符) |
| MIME 类型 | application/jsonl (非官方) | application/x-ndjson |
| 流式支持 | 支持,逐行处理 | 支持,逐行处理 |
| 采用度 | OpenAI、Hugging Face、ML/AI 生态 | Elasticsearch、Apache Spark、数据工程 |
什么是 JSONL (JSON Lines)?
JSONL,即 JSON Lines 的缩写,是一种基于文本的数据格式,每行包含一个有效的 JSON 值。行之间用换行符 (\n) 分隔。该格式由机器学习和数据科学社区推广,在 jsonlines.org 上有非正式定义。
JSONL 文件使用 .jsonl 文件扩展名。该格式已成为 AI 和 ML 训练数据的标准——OpenAI 要求使用 .jsonl 文件进行微调,Hugging Face 数据集通常使用 JSON Lines 格式。
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
什么是 NDJSON (Newline Delimited JSON)?
NDJSON,即 Newline Delimited JSON,是一种数据格式,每行是一个有效的 JSON 值,用换行符分隔。该规范托管在 github.com/ndjson/ndjson-spec,被正式化以提供更结构化的行分隔 JSON 数据标准。
NDJSON 文件使用 .ndjson 文件扩展名,并具有注册的 MIME 类型 application/x-ndjson。该格式在数据工程、日志处理和流式应用中广泛采用——Elasticsearch、Apache Spark 和许多 HTTP 流式 API 都使用 NDJSON。
{"id": 1, "text": "Hello world", "label": "greeting"}{"id": 2, "text": "How are you?", "label": "question"}{"id": 3, "text": "Goodbye", "label": "farewell"}
JSONL 和 NDJSON 是相同的格式吗?
在实践中,是的——JSONL 和 NDJSON 在功能上是完全相同的格式。两者都是每行存储一个 JSON 值,用换行符 (\n) 分隔。包含相同数据的 .jsonl 文件和 .ndjson 文件完全可以互换,任何读取其中一种格式的工具都可以读取另一种。
区别仅在于命名、社区采用和元数据约定。JSONL (JSON Lines) 来自数据科学和机器学习社区,而 NDJSON (Newline Delimited JSON) 是由数据工程和 Web 流式社区正式化的。可以理解为\"电影\"和\"影片\"——同一事物,不同圈子的名称偏好不同。
最有意义的区别是文件扩展名 (.jsonl vs .ndjson) 和 MIME 类型。NDJSON 有一个更广泛认可的 MIME 类型 (application/x-ndjson),用于 HTTP 流式上下文,而 JSONL 文件是 AI/ML 工作流的标准。在两者之间选择时,遵循您的生态系统约定。
JSONL 和 NDJSON 的主要区别
1. 规范和权威性
在 jsonlines.org 上定义,具有简洁的非正式规范。规范很直接:每行是一个有效的 JSON 值,行之间用 '\n' 分隔,建议使用 UTF-8 编码。
在 github.com/ndjson/ndjson-spec 上定义,具有稍微更正式的规范。NDJSON 明确要求每行是一个有效的 JSON 值,行分隔符是 '\n'(不是 '\r\n'),建议在末尾添加换行符。
2. 文件扩展名
使用 .jsonl 文件扩展名。这是 OpenAI 微调文件、Hugging Face 数据集和大多数 ML/AI 工具的标准。GitHub 和 VS Code 能识别 .jsonl 文件并提供语法高亮。
使用 .ndjson 文件扩展名。这在数据工程工具、Elasticsearch 批量 API 和流式 HTTP 响应中很常见。许多编辑器也支持 .ndjson 语法高亮。
3. MIME 类型
没有官方注册的 MIME 类型。常见的非官方类型包括 application/jsonl 和 application/json-lines。实际中,许多系统使用 application/jsonl 或回退到 application/json。
使用 application/x-ndjson 作为其 MIME 类型。这在 HTTP 上下文中更广泛认可,并被 Elasticsearch、Fetch API 流式标准以及各种 Web 框架用于流式响应。
4. 社区和生态采用
在 AI/ML 生态中占主导地位。OpenAI、Anthropic、Google Gemini、Hugging Face 和大多数 ML 框架使用 .jsonl。术语 'JSONL' 在开发者社区中搜索量更大,认知度更高。
在数据工程和后端系统中更受青睐。Elasticsearch、Apache Spark、PostgreSQL COPY 以及许多日志聚合工具使用 NDJSON。ndjson npm 包每周下载量达数百万。
何时使用 JSONL vs NDJSON
- 为 OpenAI、Anthropic 或其他 LLM 微调准备训练数据
- 使用 Hugging Face 数据集
- 构建 ML 管道和数据预处理
- 您的团队或文档提到 'JSON Lines'
- 上传文件到期望 .jsonl 扩展名的 AI/ML 平台
- 在 Python 数据科学环境中工作
- 通过 HTTP 流式传输 JSON 数据(Server-Sent Events、fetch 流式)
- 使用 Elasticsearch 批量 API
- 使用 Apache Spark 或类似工具构建数据管道
- 设置 Content-Type 标头 (application/x-ndjson)
- 您的基础设施或团队使用 NDJSON 约定
- 使用 Node.js 流式库
代码示例:读取 JSONL 和 NDJSON
# 读取 JSONL - 与读取 NDJSON 完全相同import jsonwith open('data.jsonl', 'r') as f:for line in f:record = json.loads(line.strip())print(record['text'])# 输出:# Hello world# How are you?# Goodbye
// 读取 NDJSON - 与读取 JSONL 完全相同import { createReadStream } from 'fs';import { createInterface } from 'readline';const rl = createInterface({input: createReadStream('data.ndjson')});for await (const line of rl) {const record = JSON.parse(line);console.log(record.text);}// 输出:// Hello world// How are you?// Goodbye