我想在使用 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文件?
我们可以使用CustomComparator并根据需要编写自己的自定义比较器
org.skyscreamer.jsonassert.Customization
org.skyscreamer.jsonassert.comparator.CustomComparator
示例:
compareJSON(expected, actual, new CustomComparator(JSONCompareMode,new Customization(addressList.street,(o1, o2) -> true)))
我发现 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);
}
}