首页 > 解决方案 > JsonNode 比较不包括字段

问题描述

我正在尝试使用ObjectMapper(Jackson) 反序列化 JSON 字符串并在执行反序列化时排除一个字段。

我的代码如下:

String aContent = new String(Files.readAllBytes(Paths.get(aFile)));
String bContent = new String(Files.readAllBytes(Paths.get(bFile)));

ObjectMapper mapper = new ObjectMapper();

FilterProvider filterProvider = new SimpleFilterProvider()
      .addFilter("_idFilter", SimpleBeanPropertyFilter.serializeAllExcept("_id"));

mapper.setFilterProvider(filterProvider);

JsonNode tree1 = mapper.readTree(aContent);
JsonNode tree2 = mapper.readTree(bContent);

String x = mapper.writeValueAsString(tree1);

return tree1.equals(tree2);

x 和 tree1 和 tree2 都包含 JSON 字符串中的值 _id 但它不会被删除。

标签: javajsonserializationjacksondeserialization

解决方案


您正在关注使用过滤器忽略字段,除了第一步

首先,我们需要在 java 对象上定义过滤器:

@JsonFilter("myFilter")
public class MyDtoWithFilter { ... }

所以目前你应该添加

@JsonFilter("_idFilter")
public class JsonNode {

这是不可能的,因此您需要创建一个扩展JsonNode并使用它的类

@JsonFilter("_idFilter")
public class MyJsonNode extends JsonNode {

如果您不想实现所有抽象方法,请定义为abstract

@JsonFilter("_idFilter")
public abstract class MyJsonNode extends JsonNode {
}

在您的代码中:

MyJsonNode tree1 = (MyJsonNode) mapper.readTree(aContent);
MyJsonNode tree2 = (MyJsonNode) mapper.readTree(bContent);

推荐阅读