修改后将 json 与嵌套元素进行比较

Compare a json with nested elements after it has been modifed

提问人:Subhomoy Sikdar 提问时间:11/15/2023 最后编辑:Subhomoy Sikdar 更新时间:11/15/2023 访问量:44

问:

我有一个用例,我想弄清楚 json 是如何修改的。我必须比较 2 个 json 对象,一个在修改之前,一个代表修改后的状态。json 中有许多嵌套对象和数组。 json 比较可以通过具有标准实现的 RFC 6902RFC 7396 完成。

JSON 实际上是一个 Java 对象,它具有许多属性和对其他对象的引用。这会导致 2 个问题。如果更新了任何子对象的引用 ID,则意味着整个对象已被替换,而不仅仅是 id 字段。另一个是集合中对象的排序。我会尝试解释 2 种情况:

假设一个子对象(在本例中为 car)被修改如下id

// initial state
{
  "employee": {
    "id": 1,
    "car": {
      "id": 11,
      "field1": "foo"
    }
  }
}
// modified state
{
  "employee": {
    "id": 1,
    "car": {
      "id": 12,
      "field1": "foo"
    }
  }
}

然后,JSON 补丁将返回或指示已更新。但在我的用例中,这意味着删除了 id 为 11 的现有子对象,并在其位置放置了 id 为 12 的新对象汽车。{"employee":{"car":{"id":12}}}[{"op":"replace","path":"/employee/car/id","value":12}]idcar

第二个问题是,在收集的情况下,顺序应该无关紧要。因此,下面的 2 个 json 比较将返回该对象未被修改。

{
  "employee": {
    "id": 1,
    "cars": [
      {
        "id": 11,
        "field1": "foo"
      },
      {
        "id": 12,
        "field1": "bar"
      }
    ]
  }
}
// modified json
{
  "employee": {
    "id": 1,
    "cars": [
      {
        "id": 12,
        "field1": "bar"
      },
      {
        "id": 11,
        "field1": "foo"
      }
    ]
  }
}

但根据 RFC 的说法,集合的顺序很重要,更改项目的索引将返回更新。对于上述更改,补丁将返回或{"employee":{"cars":[{"id":12,"field1":"bar"},{"id":11,"field1":"foo"}]}}

[{"op":"replace","path":"/employee/cars/1/id","value":11},
{"op":"replace","path":"/employee/cars/1/field1","value":"foo"},
{"op":"replace","path":"/employee/cars/0/id","value":12},
{"op":"replace","path":"/employee/cars/0/field1","value":"bar"}]

我可能可以为这两种情况编写自定义代码,但我想了解是否有任何 json 补丁实现 (java) 可以处理这两种情况,或者是否有一些库可以支持这一点。或者,如果有人知道如何最好地解决问题。

提前致谢。

java 数组 json spring json-patch

评论

0赞 derpirscher 11/15/2023
对于你的第一个问题:任何比较都只能指出差异。你如何处理这些差异取决于你。如果某些东西被修改或被新东西替换,这是一个语义问题,不能自动决定。
0赞 Subhomoy Sikdar 11/16/2023
@derpirscher我同意你的看法。如果差异发生在 以外的任何字段上,则表示对象已被修改,但如果更改,则意味着使用字段创建一个新对象并删除旧对象。这是一个深度嵌套的 json,它表示具有大量嵌套引用的 java 类,对象创建/删除将有自己的流程。我试图弄清楚处理这个问题的好方法idid
0赞 tbatch 11/16/2023
您要求的内容无法通过字符串比较来完成。正如你所说,秩序在这里很重要。例如,考虑一个差异工具。任何差异工具(例如 Beyond Compare)只会将字符串的每一行与其对应的不同字符串行进行比较(具有确定新行的一些功能)。如果要确定这些深度嵌套结构中的差异,则需要将 json 反序列化为对象并比较生成的对象字段。

答: 暂无答案