创见博客
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. 核心区别(表格版)

特性JSONJSONL
结构单个 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);
}

总结

  1. JSON = 一个整体、适合小数据/配置、不能追加
  2. JSONL = 一行一条、适合大数据/日志、支持追加、内存友好
  3. 日常开发:配置用 JSON,日志/爬虫/大数据用 JSONL
评论
0/100