首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JsonNode比较排除字段

JsonNode比较排除字段
EN

Stack Overflow用户
提问于 2018-11-03 12:44:04
回答 3查看 3K关注 0票数 6

我试图使用ObjectMapper (杰克逊)反序列化一个JSON字符串,并在执行反序列化时排除一个字段。

我的代码如下:

代码语言:javascript
复制
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,但它没有被删除。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-08 11:31:29

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

首先,我们需要在java对象上定义过滤器: @JsonFilter("myFilter")公共类MyDtoWithFilter {.}

所以目前你应该添加

代码语言:javascript
复制
@JsonFilter("_idFilter")
public class JsonNode {

这是不可能的,所以您需要创建一个扩展JsonNode的类,然后使用它

代码语言:javascript
复制
@JsonFilter("_idFilter")
public class MyJsonNode extends JsonNode {

如果不希望实现所有抽象方法,则将其定义为abstract

代码语言:javascript
复制
@JsonFilter("_idFilter")
public abstract class MyJsonNode extends JsonNode {
}

在你的代码中:

代码语言:javascript
复制
MyJsonNode tree1 = (MyJsonNode) mapper.readTree(aContent);
MyJsonNode tree2 = (MyJsonNode) mapper.readTree(bContent);
票数 2
EN

Stack Overflow用户

发布于 2018-11-07 11:35:12

FilterProvider用于自定义对象(如这里 )

如果您想坚持使用JsonNode,请使用以下方法:

代码语言:javascript
复制
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));

将印刷:

代码语言:javascript
复制
{"a":1,"b":2}
票数 2
EN

Stack Overflow用户

发布于 2018-11-11 18:43:16

如果使用Jackson2.6或更高版本,则可以使用带有自定义FilteringParserDelegateTokenFilter

代码语言:javascript
复制
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时,请确保将布尔includePathallowMultipleMatches都设置为true

代码语言:javascript
复制
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()));
    }
}

版画

代码语言:javascript
复制
{"_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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53131427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档