JSON上的文本差异报告错误的内容比正确的内容更频繁。重新缩进文件,或将属性从底部移到顶部,基于行的差异会亮起数十个更改行,即使数据是相同的。你实际想知道的是值是否更改了,而不是字节是否更改了。
使用JSON差异工具
将原始文档粘贴到之前,将更改的粘贴到之后,然后按比较。结果中的每个差异都带有值的路径和更改的两侧,所以你在读取“$.b从’x’变为’y’“而不是数加号和减号。
比较
{"a":1,"b":"x","c":true,"nested":{"n":1.0}}
对比
{"b":"y","c":true,"d":"new","nested":{"n":1}}
报告恰好三个差异:$.a已删除,$.b从"x"变为"y",$.d已添加。没有其他。$.c是相同的不出现。$.nested.n也不出现,因为1.0和1表示相同的数字。
对象和数组为什么有意地被不同地比较
对象被视为无序的,因为JSON规范说它们就是:没有定义顺序的名称和值对的集合。重新排列对象的键在这里不是更改,报告为这样的差异工具是在报告格式而不是数据。
数组按位置比较,因为这是唯一可用的诚实读取。工具无法知道你是将一个元素插入列表中间还是重写了它之后的每个元素,所以它不猜测。在长数组的开头附近插入一个项会显示为许多位置更改,这是正确的即使第一次看起来令人惊讶。
什么被视为相等
1和1.0是相同的值,字符串中转义的两种不同拼写是相同的字符串。这变得严格的一个地方是长整数:两个二十位数字必须逐位匹配才能被称为相等,因为JavaScript双精度无法唯一表示它们,悄悄地将两个不同的长ID视为相同数字的差异会积极出错。三个规则都在页面上声明,因为一个悄悄决定的差异是你无法采取行动的。
交换位置
如果你以错误的顺序粘贴了文档,交换位置会反转比较而无需重新键入任何内容,这也会翻转添加或删除报告针对哪一侧。