【问题标题】:How to get the differences for two REST API responses?如何获取两个 REST API 响应的差异?
【发布时间】:2026-02-15 00:15:01
【问题描述】:

我想比较 Java 中的两个 rest api 响应。 目前我正在使用 zjsonpatch 库,因此我能够得到差异,但差异包含其中一个 json 的值。我想要两个 json 节点。

请在下面找到我的代码:

    ObjectMapper jacksonObjectMapper = new ObjectMapper();
    JsonNode beforeNode = jacksonObjectMapper.readTree(jsonActual);
    JsonNode afterNode = jacksonObjectMapper.readTree(jsonCurrent);
    JsonPatch patch = JsonDiff.asJsonPatch(beforeNode, afterNode);
    String diffs = patch.toString();

下面是我得到的输出

op: replace; path: "/businessServiceabilityResponse/0/serviceabilityDetail/0/serviceabilitySource"; value: "ELOC"]

有没有办法让我得到两个不匹配的节点?

【问题讨论】:

  • 这能回答你的问题吗? How to compare two JsonNodes with Jackson?
  • 没有。这只是做断言并返回一个布尔值。
  • 你到底想要输出什么?节点/businessServiceabilityResponse/0/serviceabilityDetail/0?
  • @Smile 我想要两个不同的文件的节点,例如 /businessServiceabilityResponse/0/serviceabilityDetail/0/serviceabilitySource"; value: "ELOC"] 和 /businessServiceabilityResponse/0/serviceabilityDetail/0/可服务性来源”; value: "ELOC1"]... 这将清楚地显示差异
  • 我不知道是否有任何图书馆可以开箱即用地做到这一点。但是您可以编写一些自定义逻辑来根据 zjsonpatch 返回的路径从两个 json 文件中查找不匹配的值

标签: java json rest json-patch


【解决方案1】:

您可以尝试使用JSONAssert

JSONAssert.assertEquals(json1, json2, true);

json1:

[
  {
    studentname: "John",
    john: "123"
  },
  {
    studentname: "Ram",
    Ram: "124"
  }
]

json2

[
  {
    studentname: "Nhoj",
    john: "123"
  },
  {
    studentname: "Ram",
    Ram: "124"
  }
]

输出:

Exception in thread "main" java.lang.AssertionError: [0].studentname
Expected: john
     got: Nhoj

    at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:417)
    at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:394)
    at org.skyscreamer.jsonassert.JSONAssert.assertEquals(JSONAssert.java:336)
    at com.smilep.java.thirteen.so.JSONAssertExample.main(JSONAssertExample.java:32)

【讨论】:

  • 它不能解决我的目的。我需要差异。