比较两个JSON对象

48

可能重复:
JavaScript中的对象比较

是否有一种方法可以接受两个JSON对象并比较这两个对象,以查看是否有任何数据已更改?

编辑

经过评论审查,需要一些澄清。

  1. JSON对象定义为

    "无序的名称/值对集合。 对象以{(左括号)开头 并以}(右括号)结束。每个 名称后跟:(冒号),并且 名称/值对由,(逗号)分隔。"-- json.org

  2. 我的目标是能够比较2个JSON对象文字,简单来说。

我不是javascript大师,因此如果在javascript中,这些都是对象文字,那么我想这就是我应该称它们的方式。

我相信我正在寻找的是一种能够:

  1. 深度递归以查找唯一的名称/值对
  2. 确定两个对象文字的长度,并比较名称/值对,以查看是否存在任何差异。

2
没有像JSON对象这样的东西。只有JSON字符串或JavaScript对象,但不是两者的组合(好吧,也许JavaScript字符串存在;))。 - Felix Kling
4
@Felix Kling,你说得对,但在口语中,“JSON对象”对我来说意味着Java中被称为POJO的东西...一个仅包含(一层次结构的)基本数据类型的纯对象,而不是具有构造函数、私有或公共函数等的对象...虽然不技术上正确,但有助于理解问题。 - David Tang
1
@Felix Kling,*Phrogz:在JSON术语中,对象是由大括号限定的实体类型。因此,是的,有JSON对象这样的东西。(RFC http://www.ietf.org/rfc/rfc4627.txt?number=4627的第2.2节) - JeremyP
你可以使用 https://github.com/mirek/node-rus-diff 来检查差异,rusDiff(a, b) 如果 ab 相同则返回 false - Mirek Rusin
如果您想查看从json文档a到文档b的更改,请查看rfc 6902以获取json补丁及其实现。例如,Java的一个实现在这里https://github.com/flipkart-incubator/zjsonpatch。 - Mark D
显示剩余8条评论
1个回答

13

仅仅解析JSON并比较两个对象是不够的,因为它们可能不是完全相同的对象引用(但值可能相同)。

你需要进行深度相等判断。

参考自http://threebit.net/mail-archive/rails-spinoffs/msg06156.html - 该链接似乎使用了jQuery。

Object.extend(Object, {
   deepEquals: function(o1, o2) {
     var k1 = Object.keys(o1).sort();
     var k2 = Object.keys(o2).sort();
     if (k1.length != k2.length) return false;
     return k1.zip(k2, function(keyPair) {
       if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){
         return deepEquals(o1[keyPair[0]], o2[keyPair[1]])
       } else {
         return o1[keyPair[0]] == o2[keyPair[1]];
       }
     }).all();
   }
});

Usage:

var anObj = JSON.parse(jsonString1);
var anotherObj= JSON.parse(jsonString2);

if (Object.deepEquals(anObj, anotherObj))
   ...

请纠正我,但我相当确定这不是一种深度递归方法。在我看来,它只适用于1级别。 - user356808
我认为以下代码行存在问题:if (typeof o1[..] == typeof o2[..] == "object"),因为第一次比较将返回一个布尔值。 - Scott Rippey
另外,Scott Rippey是正确的,你需要在那个比较中加上&&。 - Hoffmann
11
k1.zip文件来自哪个库?它似乎不在jQuery中。 - Progo
不起作用... - Mostafa Lavaei
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接