JSONL vs NDJSON:有什么区别?

完整对比 JSONL (JSON Lines) 和 NDJSON (Newline Delimited JSON) ——两个名字几乎代表同一种格式,但有一些值得了解的细微差别。

最后更新:2026年2月

快速对比:JSONL vs NDJSON

特性JSONL (JSON Lines)NDJSON
全称JSON LinesNewline 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 格式。

data.jsonl
{"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。

data.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. 规范和权威性

JSONL

在 jsonlines.org 上定义,具有简洁的非正式规范。规范很直接:每行是一个有效的 JSON 值,行之间用 '\n' 分隔,建议使用 UTF-8 编码。

NDJSON

在 github.com/ndjson/ndjson-spec 上定义,具有稍微更正式的规范。NDJSON 明确要求每行是一个有效的 JSON 值,行分隔符是 '\n'(不是 '\r\n'),建议在末尾添加换行符。

2. 文件扩展名

JSONL

使用 .jsonl 文件扩展名。这是 OpenAI 微调文件、Hugging Face 数据集和大多数 ML/AI 工具的标准。GitHub 和 VS Code 能识别 .jsonl 文件并提供语法高亮。

NDJSON

使用 .ndjson 文件扩展名。这在数据工程工具、Elasticsearch 批量 API 和流式 HTTP 响应中很常见。许多编辑器也支持 .ndjson 语法高亮。

3. MIME 类型

JSONL

没有官方注册的 MIME 类型。常见的非官方类型包括 application/jsonl 和 application/json-lines。实际中,许多系统使用 application/jsonl 或回退到 application/json。

NDJSON

使用 application/x-ndjson 作为其 MIME 类型。这在 HTTP 上下文中更广泛认可,并被 Elasticsearch、Fetch API 流式标准以及各种 Web 框架用于流式响应。

4. 社区和生态采用

JSONL

在 AI/ML 生态中占主导地位。OpenAI、Anthropic、Google Gemini、Hugging Face 和大多数 ML 框架使用 .jsonl。术语 'JSONL' 在开发者社区中搜索量更大,认知度更高。

NDJSON

在数据工程和后端系统中更受青睐。Elasticsearch、Apache Spark、PostgreSQL COPY 以及许多日志聚合工具使用 NDJSON。ndjson npm 包每周下载量达数百万。

何时使用 JSONL vs NDJSON

JSONL使用 .jsonl 的场景:
  • 为 OpenAI、Anthropic 或其他 LLM 微调准备训练数据
  • 使用 Hugging Face 数据集
  • 构建 ML 管道和数据预处理
  • 您的团队或文档提到 'JSON Lines'
  • 上传文件到期望 .jsonl 扩展名的 AI/ML 平台
  • 在 Python 数据科学环境中工作
NDJSON使用 .ndjson 的场景:
  • 通过 HTTP 流式传输 JSON 数据(Server-Sent Events、fetch 流式)
  • 使用 Elasticsearch 批量 API
  • 使用 Apache Spark 或类似工具构建数据管道
  • 设置 Content-Type 标头 (application/x-ndjson)
  • 您的基础设施或团队使用 NDJSON 约定
  • 使用 Node.js 流式库

代码示例:读取 JSONL 和 NDJSON

读取 .jsonl 文件(Python)
# 读取 JSONL - 与读取 NDJSON 完全相同
import json
with 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 文件(JavaScript/Node.js)
// 读取 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

验证你的 JSONL / NDJSON 文件

检查你的 .jsonl 或 .ndjson 文件格式是否正确。我们的免费验证器可逐行检查 JSON 语法。

即时查看 JSONL 和 NDJSON 文件

在浏览器中打开最大 1GB 的 .jsonl 和 .ndjson 文件。无需上传,无需注册——无缝支持两种格式。

常见问题

JSONL vs NDJSON — 它们一样吗?关键区别 | jsonl.co