使用 skyscreamer 比较两个 json 文件时如何忽略某些属性

问题描述 投票:0回答:2

我想在使用 skyscreamer 比较两个 JSON 文件时排除某些 JSON 属性。

测试文件1:

 {
   "Name":"test1",
   "addressList":[
      {
         "street":"123 fake street",
         "postalcode":"33344"
      },
      {
         "street":"99 street avn",
         "postalcode":"23434"
      },
      {
         "street":"900 street city",
         "postalcode":"45100"
      }
   ]
}

测试文件2:

 {
   "Name":"test1",
   "addressList":[
      {
         "street":"123 fake street",
         "postalcode":"33344"
      },
      {
         "street":"88 abc street",
         "postalcode":"23434"
      },
      {
         "street":"900 street city",
         "postalcode":"45100"
      }
   ]
}

如何通过排除addressList.street属性来比较上述JSON文件?

java json jackson
2个回答
3
投票

我们可以使用CustomComparator并根据需要编写自己的自定义比较器

 org.skyscreamer.jsonassert.Customization
 org.skyscreamer.jsonassert.comparator.CustomComparator

示例:

compareJSON(expected, actual,  new CustomComparator(JSONCompareMode,new Customization(addressList.street,(o1, o2) -> true)))

0
投票

我发现 CustomComparator 不能很好地处理 json 列表/数组,特别是当你想删除 skyscreamer 用于标识数组中每个元素的 id 时,所以我找到了使用 objectMapper 的不同解决方案。 为了以防万一它对人们有任何用处,我做了一个removeTags方法,你可以给它一个节点名称/标签列表,它会为你从JSON字符串中删除它们......然后做一个漂亮的打印:-)

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
...

public static String removeTags(List<String> tagsToRemove, String json) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        JsonNode jsonNode = objectMapper.readTree(json);
        for (String tagToRemove : tagsToRemove) {
            List<JsonNode> parentNodes = jsonNode.findParents(tagToRemove);
            for (JsonNode parentNode : parentNodes) {
                ((ObjectNode) parentNode).remove(tagToRemove);
            }
        }
        return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.