JsonNode比较不包括字段

Mkl*_*Rjv 5 java serialization json jackson deserialization

我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

x和tree1以及tree2都包含JSON字符串中的值_id,但不会将其删除.

use*_*900 2

除了第一步之外,您正在遵循使用过滤器忽略字段

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

@JsonFilter("myFilter")
public class MyDtoWithFilter { ... }
Run Code Online (Sandbox Code Playgroud)

所以目前你应该添加

@JsonFilter("_idFilter")
public class JsonNode {
Run Code Online (Sandbox Code Playgroud)

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

@JsonFilter("_idFilter")
public class MyJsonNode extends JsonNode {
Run Code Online (Sandbox Code Playgroud)

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

@JsonFilter("_idFilter")
public abstract class MyJsonNode extends JsonNode {
}
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

MyJsonNode tree1 = (MyJsonNode) mapper.readTree(aContent);
MyJsonNode tree2 = (MyJsonNode) mapper.readTree(bContent);
Run Code Online (Sandbox Code Playgroud)