你能用GSON的JsonElement对大多数但不是所有的班级成员进行等同比较

时间:2014-05-23 15:49:25

标签: java json gson

我正在使用JUnit编写单元测试,我想知道是否有办法对其进行assertEquals比较。

我想要比较两个JsonElement类,但我想忽略JSON中数组属性中的一个字段。

我的JSON看起来像这样:

{
   "name":"Jon",
   "arrayProps":[
      {
         "careAbout":"123",
         "doNotCareAbout":"blablabla"
      },
      {
         "careAbout":"456",
         "doNotCareAbout":"blablabla"
      },
      {
         "careAbout":"789",
         "doNotCareAbout":"blablabla"
      }
   ]
}

我想比较除doNotCareAbout元素之外的所有字段。当我打电话时,这可能与GSON有关:

JsonElement element1 = ...;
JsonElement element2 = ...;
assertEquals(element1, element2);

如果不是,有人可以推荐一个合适的库,在那里我可以进行这种比较,我想排除一些元素吗?

2 个答案:

答案 0 :(得分:1)

您可以改为忽略该元素来编写自定义比较器(或覆盖compareTo),并验证assertEquals(compare(element1, element2), 0);assertEquals(element1.compareTo(element2), 0);。因为你只是想看看它们是否相等,所以很容易迭代元素。

最好使用比较器,这样就不会用特定于测试的东西来污染你的对象。

答案 1 :(得分:1)

您可以从“arrayProps”数组中的每个元素中删除“doNotCareAbout”属性,如下所示:

JsonObject jsonObject = (JsonObject) element;
JsonArray arrayProps = (JsonArray) jsonObject.get("arrayProps");
for (JsonElement arrayProp : arrayProps) {
    JsonObject arrayPropObject = (JsonObject) arrayProp;
    arrayPropObject.remove("doNotCareAbout");
}

System.out.println(jsonObject); // prints {"name":"Jon","arrayProps":[{"careAbout":"123"},{"careAbout":"456"},{"careAbout":"789"}]}

执行此操作后,您应该能够以您想要的方式比较JsonElements。

或者,您可以使用json-path库来提取您想要比较的属性:

String name = JsonPath.read(json, "$.name");
System.out.println(name); // prints Jon

List<String> careAboutProps = JsonPath.read(json, "$.arrayProps[*].careAbout");
System.out.println(careAboutProps); // prints ["123","456","789"]

但是,如果“arrayProps”的真实元素具有很多属性并且您只想排除其中的一些属性,那么这可能是不可行的。