使用方法
- 01粘贴一个文档;提示会立即显示「有效」或错误位置。
- 02选择缩进(0、2、4 或制表符),然后格式化、压缩、排序键,或把整个文档转义成 JSON 字符串。
- 03查询时使用带数组索引的点路径——
owner.email、items[0]、items[-1].id,以及 items[*].price、owner.* 这类通配符。 - 04切到 Diff 粘贴第二个文档;切到 CSV 可在两个方向转换;用 TS 标签页生成接口。
计算示例
对于这个文档
{
"name": "CalcX sample",
"version": 2,
"tags": ["math", "dev"],
"owner": { "id": 7, "email": "dev@example.com", "active": true },
"items": [ { "id": 1, "price": 9.9 }, { "id": 2, "price": 19.9 } ]
}
统计栏读出深度 4、键 12(其中唯一名称 9)、节点 17、数组 2(最长 2)、压缩后大小 167 bytes,以及类型直方图 object:4 string:4 number:6 array:2 boolean:1。查询对 items[*].price 返回 $.items[0].price = 9.9 和 $.items[1].price = 19.9,而 items[-1].id 解析为最后一个元素的 id,即 2。TS 标签页生成 Root、Owner 和 Items 接口,把两个数组对象映射为 (Items | Items2)[]。对第二个版本——version: 3、tags 追加 "finance"、owner 的 email 被删除、active 翻转为 false、第一个条目的价格从 9.9 提高到 12.5——diff 报告新增 1($.tags[2])、删除 1($.owner.email)、更改 3($.version、$.owner.active、$.items[0].price)和相同 7。无效文档会以行和列报告首个错误——{ "a": 1, } 在第 1 行第 11 列失败。
同样的数据,不同的形态
结构差异并行遍历两个文档:对象按键匹配,数组按下标匹配。这就是 $.tags[2] 显示为新增而不是改写的原因,也是在大数组前端插入一个元素会让后面每个下标都显示为更改的原因——这是位置差异,不是文本差异。TS 生成器遍历同一棵树,并按键名为嵌套接口命名,所以两个 item 对象变成 Items 和 Items2,而不是复用一个类型。面板的 CSV 转换遵循 RFC 4180 并正确加引号("Doe, John",字面引号用 "" 表示),还会把纯数字字符串转回数字,并且每个表头只匹配一次。
限制与诚实的假设
- 无模式、无扩展。
- 只校验 JSON 语法——不校验 JSON Schema、JSON5、注释或尾随逗号——并且只报告首个错误,而不是全部。
- 数字是双精度。
- JSON 只有一种数字类型;超过 2^53 的整数会丢失精度,面板会若无其事地显示舍入后的值。
- 数组差异基于位置。
- 重新排序会显示为更改;当顺序不应有影响时,请比较排序后的键。
- CSV 双向都有损失。
- 嵌套对象会被字符串化到单元格里,类型转换是启发式的。
防止坏 JSON 的三个习惯
尾随逗号和 // 注释是最常见的无效 JSON 错误,而错误位置告诉你解析停在哪里,而不是错误从哪里开始——修好被指出的位置再检查一遍。重复键合法但悄无声息:{"a":1,"a":2} 解析为 a = 2,所以重复字段可能掩盖真实的值。超过 2^53 的校验和或 ID 在 JSON 中应当用字符串;存成数字可能通过显示,却在别处的签名校验中失败。
使用场景
调试 API 载荷
粘贴响应,用缩进 2 格式化,查询你关心的字段,再与上一次响应对比,准确看出哪些路径发生了变化。
为客户端生成类型
把有代表性的载荷粘贴到 TS 标签页,把生成的接口当作起点——然后手动收紧可选字段,因为生成器只从一个样本推断。
隐私
解析、差异和转换都在你的浏览器中运行;文档从不上传或存储。
本页计算器
精选工具,点开即用;小工具可直接试算,数值会带入完整计算器。