我试图使用ObjectMapper (杰克逊)反序列化一个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,但它没有被删除。
发布于 2018-11-08 11:31:29
除了第一步之外,您正在遵循忽略使用过滤器的字段
首先,我们需要在java对象上定义过滤器: @JsonFilter("myFilter")公共类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);发布于 2018-11-07 11:35:12
FilterProvider用于自定义对象(如这里 )
如果您想坚持使用JsonNode,请使用以下方法:
String aContent = new String("{\"a\":1,\"b\":2,\"_id\":\"id\"}");
ObjectMapper mapper = new ObjectMapper();
JsonNode tree1 = mapper.readTree(aContent);
ObjectNode object = (ObjectNode) tree1;
object.remove(Arrays.asList("_id"));
System.out.println(mapper.writeValueAsString(object));将印刷:
{"a":1,"b":2}发布于 2018-11-11 18:43:16
如果使用Jackson2.6或更高版本,则可以使用带有自定义FilteringParserDelegate的TokenFilter。
public class PropertyBasedIgnoreFilter extends TokenFilter {
protected Set<String> ignoreProperties;
public PropertyBasedIgnoreFilter(String... properties) {
ignoreProperties = new HashSet<>(Arrays.asList(properties));
}
@Override
public TokenFilter includeProperty(String name) {
if (ignoreProperties.contains(name)) {
return null;
}
return INCLUDE_ALL;
}
}使用此FilteringParserDelegate创建PropertyBasedIgnoreFilter时,请确保将布尔includePath和allowMultipleMatches都设置为true。
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String jsonInput = "{\"_p1\":1,\"_p2\":2,\"_id\":\"id\",\"_p3\":{\"_p3.1\":3.1,\"_id\":\"id\"}}";
JsonParser filteredParser = new FilteringParserDelegate(mapper.getFactory().createParser(new ByteArrayInputStream(jsonInput.getBytes())),
new PropertyBasedIgnoreFilter("_id"),
true,
true);
JsonNode tree = mapper.readTree(filteredParser);
System.out.println(jsonInput);
System.out.println(tree);
System.out.println(jsonInput.equals(tree.toString()));
}
}版画
{"_p1":1,"_p2":2,"_id":"id","_p3":{"_p3.1":3.1,"_id":"id"}}
{"_p1":1,"_p2":2,"_p3":{"_p3.1":3.1,"_id":"id"}}
false如您所见,嵌套的_id事件不会被过滤掉。如果这不是您所需要的,您当然可以用您自己的PropertyBasedIgnoreFilter实现来扩展我的TokenFilter。
https://stackoverflow.com/questions/53131427
复制相似问题