JSON 和 JSONL 文件的核心区别
七崽爱吃小饼干2026/05/14阅读 0
JSON 是一个完整的大对象/数组,JSONL 是一行一条独立 JSON 的「行式存储」,二者格式、用法、性能完全不同。
1. 基础定义
JSON(.json)
- 标准结构化数据格式,整个文件是一个合法的 JSON 结构(对象
{}或数组[]) - 必须整体解析、整体写入
- 人类可读性强,适合配置文件、小批量数据
JSONL(.jsonl)
- JSON Lines 缩写,也叫 NDJSON
- 规则:每一行是一条独立、完整的 JSON
- 行与行之间用换行符
\n分隔 - 适合大数据、流式处理、日志存储
2. 直观格式对比
JSON 文件示例(data.json)
整个文件是一个数组,所有数据包裹在一起:
json
[
{"id": 1, "name": "张三"},
{"id": 2, "name": "李四"},
{"id": 3, "name": "王五"}
]
JSONL 文件示例(data.jsonl)
一行一条数据,每行都是独立 JSON:
json
{"id": 1, "name": "张三"}
{"id": 2, "name": "李四"}
{"id": 3, "name": "王五"}
3. 核心区别(表格版)
| 特性 | JSON | JSONL |
|---|---|---|
| 结构 | 单个 JSON 对象/数组 | 每行一条独立 JSON |
| 解析方式 | 必须全部加载后解析 | 可逐行读取、逐行解析 |
| 内存占用 | 高(大文件易 OOM) | 低(只加载当前行) |
| 写入方式 | 一次性写入 | 支持追加写入(日志常用) |
| 处理速度 | 大数据慢 | 大数据极快 |
| 适用场景 | 配置文件、小数据、API 接口 | 日志、爬虫、大数据、流式数据 |
| 工具支持 | 所有语言原生支持 | 大数据工具(Spark、Pandas、ES)优先支持 |
4. 关键使用差异
① 读取/解析
- JSON:必须把整个文件读进内存,再
json.load()解析 - JSONL:按行读取,每行
json.loads(),不用加载全部数据
② 追加数据
- JSON:无法直接追加!必须读取整个文件 → 修改数组 → 重新写入(极易出错、慢)
- JSONL:直接在文件末尾加一行即可,高效无损
③ 大数据场景
- 10GB 日志文件:
- JSON:根本打不开,内存直接爆掉
- JSONL:逐行处理,秒级运行
5. 最适合的使用场景
用 JSON 的场景
- 配置文件(
config.json) - API 请求/响应数据
- 小批量结构化数据
- 需要完整嵌套结构的数据
用 JSONL 的场景
- 日志存储(nginx、应用日志)
- 爬虫结果保存
- 大数据分批导出/导入
- 流式处理、实时写入
- Elasticsearch 批量导入数据
6. 简单代码示例(Node.js)
1. 读取 JSONL(逐行高效)
javascript
const fs = require('fs');
const readline = require('readline');
// 逐行读取 JSONL,内存占用极低
const rl = readline.createInterface({
input: fs.createReadStream('data.jsonl', 'utf8'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
const data = JSON.parse(line); // 只解析当前一行
console.log(data);
});
2. 读取 JSON(必须全量加载)
javascript
const fs = require('fs');
// 一次性读取整个 JSON 文件
fs.readFile('data.json', 'utf8', (err, data) => {
if (err) throw err;
const dataList = JSON.parse(data); // 全量解析
for (const item of dataList) {
console.log(item);
}
});
同步版本(更简单,适合小文件)
JSON 同步读取
javascript
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('data.json', 'utf8'));
console.log(data);
JSONL 同步逐行读取
javascript
const fs = require('fs');
const lines = fs.readFileSync('data.jsonl', 'utf8').split('\n').filter(Boolean);
for (const line of lines) {
const item = JSON.parse(line);
console.log(item);
}
总结
- JSON = 一个整体、适合小数据/配置、不能追加
- JSONL = 一行一条、适合大数据/日志、支持追加、内存友好
- 日常开发:配置用 JSON,日志/爬虫/大数据用 JSONL