2012-07-11 86 views
3

我正在使用促销代码的网站上为用户提供免费会员资格。成员注册的级别是促销代码对象的属性,并以int或1或2的形式存储在数据库中。但是,唯一一次成员级别属性与网站的用户界面相关的情况是与特定促销代码关联的着陆页。所以对于这种情况,我不希望JSON忽略成员级别。在用户返回到该网站并有与其帐户关联的促销代码对象后,我们不再关心其成员级别,因此我希望JSON可以忽略成员级别属性。属性@JSONIgnore是否可以在每次调用时设置?

所以我的问题是,是否有可能在每个访问的基础上设置一个对象的属性为@JSONIgnore,还是只能忽略或不能忽略一个属性?换句话说有没有像object.getAttribute().setAttributeJSONIgnore(true | false)这样的方法?

+1

参见:http://stackoverflow.com/questions/11232045/serialization-and-deserialization-with-jackson-how-to-programmatically-ignore -f/11233190#11233190。您无法在运行时选择性地打开/关闭'@ JsonIgnore'。 – pb2q 2012-07-11 18:27:48

+0

很高兴知道。欢呼声 – EJay 2012-07-11 18:31:20

+0

我认为这个问题表明应用程序业务逻辑被放在错误的地方。我建议让数据序列化/反序列化(传输)层尽可能愚蠢,并将业务逻辑放在人们期望的地方,在哪里更容易维护。 – 2012-07-12 17:50:31

回答

4

编号基于注释的方法是静态的,因为尽管您可以使用自定义AnnotationIntrospector,但由于结构的构造昂贵,导致JsonSerializer实例被重用。

但有些方法可以过滤出属性,例如查看“Filtering Properties”这篇文章。

2

我已经做了类似的JSONViews(http://wiki.fasterxml.com/JacksonJsonViews)。

您将创建一个基本视图,然后使用PromoPage视图对其进行扩展。在要序列化的对象中,您需要将注释添加到每个属性。所以,你要的那些出现每次将

@JsonView(Views.Base.class) 
String name; 

要只显示那些特定的促销页面会像

@JsonView(Views.PromoPage.class) 
Integer memberLevel; 

然后,如果你有不同的JAX-RS方法的性质用于获取promopages比其他的登陆页面,你可以注释,象这样

@JsonView(Views.Base.class) 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Object getNormalLandingPageInfo() { 
    ... 
    } 

    @JsonView(Views.PromoPage.class) 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Object getPromoLandingPageInfo() { 
    ... 
    } 

适当的查看方法,如果你不这样做,在你的逻辑,你可以做任何你想做的确定何时显示PromoPage视图,然后做这样的事情

if (showPromoPage) 
    objectMapper.writeValueUsingView(out, object, Views.PromoPage.class); 
else 
    objectMapper.writeValueUsingView(out, object, Views.Base.class); 
相关问题