9

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

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

4

2 回答 2

7

不会。基于注解的方法是静态的,因为尽管您可以使用 custom AnnotationIntrospector,但生成JsonSerializer的实例会被重用,因为它们的构造成本很高。

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

于 2012-07-12T16:22:04.660 回答
3

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

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

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

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

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

然后,如果您有不同的 JAX-RS 方法来获取促销页面而不是其他登录页面,您可以使用适当的视图注释这些方法,如下所示

  @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);
于 2016-10-17T17:02:43.940 回答