⭐ 觉得好用?收藏备用,下次直接打开
错误行
JSON 缩进
分隔符
嵌套处理
等待输入
输入
输出

NDJSON(Newline Delimited JSON,又名 JSONL / JSON Lines)是一种每行一条独立 JSON 对象的文本格式,行与行之间用 \n 分隔。它没有外层 []、对象之间也没有逗号,因此可以边写边读、边追加边处理——日志系统、流式接口、Kafka / 数仓导出几乎都用这种格式。本工具支持 NDJSON / JSONL ↔ JSON 数组 ↔ CSV 三方互转,自带错误行号定位和字段集合统计。

三种格式的差别

格式长什么样适合场景
NDJSON / JSONL每行一条 JSON {"id":1}\n{"id":2}日志 / 流式 / 大文件追加
JSON 数组整体一个数组 [{"id":1},{"id":2}]接口返回 / 配置文件
CSV表头 + 行 id\n1\n2Excel / 非技术同事

NDJSON 文件常以 .ndjson.jsonl 为后缀,本工具拖入文件时自动识别。

为什么 NDJSON 而不是 JSON 数组

JSON 数组要求整个文件是一个合法 JSON——必须读到 ] 才能解析、追加新记录得反序列化整个数组重新写出、坏掉一个字符整个文件就废了。NDJSON 把这三个限制全部解掉:

  • 流式:拿到一行解析一行,无需读完整个文件
  • 可追加:直接 >> 追加新行就行,不需要重写
  • 容错:某一行坏了只影响这一行,其余记录照常处理

代价是它整体不是合法 JSON,标准 JSON.parse 不能直接吃,必须按行处理——也正是本工具要解决的问题。

错误行号怎么算

“跳过并报告”模式下,工具按输入文本里的物理行号(1-based)汇报每个错误行:

  • 空行被跳过但不打乱后续行号编号
  • 行内含未转义 \n 视为多行,按 JSON 解析失败处理
  • 行尾 \r\n(Windows 换行)自动归一
  • BOM 头()自动剥掉

错误列表展示前 50 条,每条带消息预览。如果坏行率高,建议切到首错停止模式定位最早的格式问题。

局限与免责

  • 5 MB 上限:浏览器内单次处理建议 < 5 MB;更大文件用命令行 jq -c 或 Python 脚本处理
  • 不支持 JSON Stream:跨行的”流式 JSON”(多个对象拼接、对象跨多行)需先用 jq -c . 规整成单行
  • CSV 的嵌套数组:含对象的数组会被序列化成 JSON 字符串塞进单元格,无法 100% 往返还原结构
  • 所有处理在浏览器本地完成,不上传任何数据

📍使用场景

  • 日志/事件流转 JSON 数组服务端按行写出的日志或事件流(每行一条 JSON)攒成一个 JSON 数组,方便前端一次拿到、或贴到接口文档里举例。
  • 接口导出转 CSV 给 Excel数据库 / 数仓导出的 NDJSON / JSONL 一键转 CSV,嵌套字段自动 `a.b` 扁平化,给非技术同事直接用 Excel 打开。
  • 把 CSV 改成流式 JSONL拿到 Excel 导出的 CSV 想用脚本逐行处理(grep / jq / awk),转成 NDJSON 后每行就是一条独立 JSON,无需读完整文件即可流式处理。
  • 上游坏行定位第三方推过来的 NDJSON 偶尔混入半截 JSON 或编码错误,"跳过并报告"模式直接给出每个错误行号 + 内容预览,不用逐行肉眼找。

常见问题

NDJSON、JSONL、LDJSON、ld+json 是同一个东西吗?

前三个是,最后一个不是。NDJSON(Newline Delimited JSON)、JSONL(JSON Lines) 和 LDJSON(Line Delimited JSON) 是同一种格式的三个名字——每行一条独立、合法的 JSON,行之间用 \n 分隔,没有外层数组。application/ld+json 是另一回事,全称 *JSON-LD*(JSON for Linked Data),用来描述结构化数据(Schema.org),跟 NDJSON 没关系。本工具支持前三种,文件名 .ndjson / .jsonl 自动识别。

为什么不能直接用 JSON.parse 解析整个 NDJSON 文件?

NDJSON 整体不是合法 JSON——多个对象之间没有逗号、外层没有 []JSON.parse 会在第二行立刻报 Unexpected token。NDJSON 必须按行拆分后逐行解析。这正是它的设计目的:日志、流式接口、Kafka/数仓导出场景下可以边写边读、边追加边处理,不需要把所有数据读完才能解析;坏掉一行也只丢这一行,不会让后续记录全部失效。

NDJSON 转 CSV 时,嵌套字段(user.name)怎么处理?

默认 a.b 扁平化{"user":{"name":"Alice"}} 会变成 CSV 的 user.name 列,值 Alice。数组若全是基础类型(数字/字符串)会用 | 拼接(tags=core|ops);如果数组里是对象或字典,整段当作 JSON 字符串塞进单元格。也可以切到"嵌套处理 = JSON 字符串",所有非标量值统一序列化为 JSON 字符串列。反向(CSV → NDJSON)会按 a.b 把扁平列还原成嵌套对象,圆环往返不丢结构。

"跳过错行 / 首错停止"两种模式怎么选?

调试线上日志、抓包导出选"跳过并报告"——上游可能混入半截 JSON、字段越界、编码异常,这模式会把所有坏行收集起来列出行号 + 预览,让你定位到底是第几行、什么内容坏了,其余记录正常解析转换。做数据迁移、ETL 校验选"首错停止"——要求源数据严格合法时,遇到第一处错误立即抛错,避免静默丢数据让下游误以为全量成功。错误行号按输入文本里的实际物理行号计算,空行被跳过但不打乱编号。

怎样区分 NDJSON 和 JSON Stream(流式 JSON)?

NDJSON 有唯一一种合法布局:每条独立 JSON 占一整行,行内不能含未转义的 \n,行之间靠 \n 分隔。"Concatenated JSON"(也叫 JSON Stream / record-jsonseq RFC 7464)是更宽松的家族——多个 JSON 对象直接拼接、可跨行、可有空白,依靠括号配对识别边界,需要状态机解析器。本工具只支持 NDJSON,遇到一行内有多个对象、或一个对象跨多行的"流式 JSON"会按错行处理。如果数据是这类格式,先用 jq -c . 之类工具规整成单行再来。

上传的数据会不会发到服务器?

不会。所有解析、转换、错误检测都在浏览器本地完成,不发起任何网络请求,可断网使用。文件大小上限 5 MB 是为了防止页面卡顿;更大的文件建议用命令行 jq -c 或脚本处理。复制 / 下载结果也只走本地剪贴板和 Blob 下载链接。