可以根据每个呼叫设置属性@JSONIgnore吗?

时间:2012-07-11 18:24:15

标签: java json jackson

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

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

2 个答案:

答案 0 :(得分:5)

没有。基于注释的方法是静态的,因为虽然您可以使用自定义AnnotationIntrospector,但由于构造成本高昂,因此会重复使用生成的JsonSerializer实例。

但是有一些方法可以过滤掉属性,例如请查看“Filtering Properties”文章。

答案 1 :(得分:2)

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

您创建一个基本视图,然后使用PromoPage View扩展它。在您要序列化的对象中,您需要为每个属性添加注释。所以你想每次出现的那些都是

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

您只想在某些促销页面上显示的属性类似

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

然后,如果您使用不同的JAX-RS方法获取promopages而不是其他着陆页,您可以使用适当的View注释方法,如此

  @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 View的内容,然后执行类似的操作

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