【问题标题】:Jackson Different JSONFilter same ClassJackson 不同的 JSONFilter 相同的类
【发布时间】:2014-11-20 14:05:46
【问题描述】:

我正在尝试使用不同的 JsonFilters 来序列化同一类的对象。

想象一下 Foo 类

public class Foo{
    Bar p1;
    Bar p2;
}

和类酒吧

@JsonFilter("myFilter")
public class Bar{
    String prop1;
    String prop2;
    String prop3;
}

现在我想要实现的是为 Foo 类中的变量 p1 和 p2 设置不同的 JsonFilters。

例如。对于 p1,我只想序列化 prop1,对于 p2,我想序列化 prop2 和 prop3。 获取以下json

{
    "p1": { "prop1":"blabla" }
    "p2": { "prop2":"blabla", "prop3":"blabla" }
}

所以我会使用以下过滤器,以便只有“prop1”会被序列化:

FilterProvider filter = new SimpleFilterProvider().addFilter("myFilter",
    SimpleBeanPropertyFilter.filterOutAllExcept("prop1"));

String json = new ObjectMapper().filteredWriter(filter).writeValueAsString(foo)

但是使用它也会导致 p2 被序列化只有 prop1

我想像这样为 p2 创建另一个过滤器:

FilterProvider filter2 = new SimpleFilterProvider().addFilter("myFilter",
    SimpleBeanPropertyFilter.filterOutAllExcept("prop2","prop3"));

但我真的找不到如何实现它,因此 p1 和 p2 有不同的过滤器,因为它们属于同一类 Foo。

感谢您的阅读,希望有人能帮忙!

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    从 Jackson 2.3 开始,@JsonFilter 注释可以放在字段和方法上。我认为它应该对你的情况有所帮助。这是一个例子:

    public class JacksonFilters {
        static class Bar {
            final public String prop1;
            final public String prop2;
            final public String prop3;
    
            Bar(final String prop1, final String prop2, final String prop3) {
                this.prop1 = prop1;
                this.prop2 = prop2;
                this.prop3 = prop3;
            }
        }
    
        static class Foo {
            @JsonFilter("myFilter1")
            final public Bar p1;
            @JsonFilter("myFilter2")
            final public Bar p2;
    
            Foo(final Bar p1, final Bar p2) {
                this.p1 = p1;
                this.p2 = p2;
            }
        }
    
        public static void main(String[] args) throws JsonProcessingException {
            final SimpleFilterProvider filterProvider = new SimpleFilterProvider();
            filterProvider.addFilter("myFilter1",
                    SimpleBeanPropertyFilter.filterOutAllExcept("prop1"));
            filterProvider.addFilter("myFilter2",
                    SimpleBeanPropertyFilter.serializeAllExcept("prop2"));
    
            final Foo bar = new Foo(new Bar("a", "b", "c"), new Bar("d", "e", "f"));
    
            final ObjectMapper mapper = new ObjectMapper();
            mapper.setFilters(filterProvider);
            System.out.println(mapper
                            .writerWithDefaultPrettyPrinter()
                            .writeValueAsString(bar));
        }
    
    }
    

    输出:

    {
      "p1" : {
        "prop1" : "a"
      },
      "p2" : {
        "prop1" : "d",
        "prop3" : "f"
      }
    }
    

    【讨论】:

    • 谢谢!现在效果很好:D,我尝试用 JsonFilter 注释一个字段,但它不起作用,因为我有一个旧版本的 Jackson :z
    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多