【问题标题】:Can the property @JSONIgnore be set on a per call basis?属性 @JSONIgnore 可以在每次调用的基础上设置吗?
【发布时间】:2012-07-11 18:24:15
【问题描述】:

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

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

【问题讨论】:

  • 见:stackoverflow.com/questions/11232045/…。您不能在运行时选择性地打开/关闭@JsonIgnore
  • 我认为这个问题表明应用程序业务逻辑被放置在错误的位置。我建议让数据序列化/反序列化(传输)层尽可能地笨拙,并将业务逻辑放在人们期望的地方,并且更容易维护。

标签: java json jackson


【解决方案1】:

没有。基于注释的方法是静态的,因为虽然您可以使用自定义 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 方法来获取促销页面而不是其他登陆页面,你可以像这样使用适当的视图注释方法

      @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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2022-01-27
      相关资源
      最近更新 更多