piapia123
zh

JSONL / NDJSON ↔ JSON 互转

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把 JSONL(也叫 NDJSON,一行一个 JSON)合成一个 JSON 数组,或反过来把一个 JSON 数组拆成逐行。日志、数据导出、流式接口的产物大量用这个格式。 「一行一个 JSON」是这个格式的全部约定,所以这里按行解析,并在出错时指出是第几行 —— 一份几千行的数据里只说「解析失败」等于没说。空行会被跳过(文件末尾多一个换行是常态),CRLF 与 BOM 也都处理了。 ⚠️ 一个常见的误用:把一个美化过的多行 JSON 对象粘进来是不行的。那看起来很像,但它不是 JSONL —— 每一行都得自己就是一段完整的 JSON。这种情况会明确报错并说清原因。 ⚠️ 一处这里解决不了的精度问题:超过 2^53 的整数在 JSON 里本来就存不下(推特那类的雪花 ID 就是),`JSON.parse` 会让 `9007199254740993` 变成 `...992`。这是 JSON 与 JavaScript 的固有问题,任何用 `JSON.parse` 的工具都一样。如果你的数据里有这种 ID,请让上游按字符串输出。

功能

  • 两个方向:JSONL → JSON 数组、JSON 数组 → JSONL
  • 逐行解析,出错时指出是第几行(按原始文件的行号算,跳过的空行也计入)
  • 空行跳过、CRLF 与 LF 都认、开头的 BOM 剥掉
  • 误把美化过的多行 JSON 粘进来时会明确报错,并说清「每一行都要自己是一段完整 JSON」
  • JSON → JSONL 时校验顶层是数组,而不是默默输出一行
  • 字符串里的换行会被转义,保证输出的每一行仍然是独立可解析的
  • JSON 缩进可选 2 / 4 空格、制表符,或压成一行

使用方法

  1. 把 JSONL 粘进输入框,或粘贴一段 JSON 数组
  2. 多行的 JSONL 会自动识别;只有一行的 JSON 对象请手动选方向
  3. 结果实时出现
  4. 点复制取走结果

常见问题

为什么我的 JSON 粘进来说要一个数组?
因为「一段 JSON」与「一行 JSONL」长得一模一样 —— 单独一个 `{"a":1}` 既是一段合法的 JSON,也可以是一行 JSONL,这个歧义没法自动消解。所以自动模式下遇到能解析成 JSON 的输入就按「JSON → JSONL」处理,而那个方向要求顶层是数组(每个元素占一行)。要把单个对象当成一行 JSONL,把方向手动改成「JSONL → JSON」即可。
为什么我把美化过的 JSON 粘进来会报错?
因为它不是 JSONL。JSONL 的约定是每一行自己就是一段完整的 JSON,而美化过的 JSON 把一个对象拆成了多行 —— 第一行 `{` 单独拿出来不是合法的 JSON。本工具按行解析,所以会在第 1 行就报错,并提示这一点。先把那份 JSON 压成一行(用本站的 JSON 格式化工具选「紧凑」),或者直接粘成数组让它走另一个方向。
大整数(比如推特的 ID)会丢精度吗?
会,而且这里解决不了。 超过 2^53 的整数在 JavaScript 的数字类型里无法精确表示,`JSON.parse` 会让 `9007199254740993` 变成 `9007199254740992` —— 尾数悄悄丢了。这是 JSON 与 JavaScript 的固有问题,不是这个工具的实现问题:任何用 `JSON.parse` 的地方(包括浏览器里 fetch 之后的 `response.json()`)都一样。唯一的解法是让上游把这种 ID 按字符串输出(`"9007199254740993"`),那样一个字符都不会丢。
空行会变成空记录吗?
不会,空行会被跳过。文件末尾多一个换行、行与行之间多敲了回车,都是编辑时的常态,把它们变成 `null` 或空字符串记录只会污染数据。同样地,每行首尾的空白也会被去掉 —— 那不影响行内的内容,因为 JSON 里的空白本来就没有意义。

相关工具