杰克逊动态改变JsonIgnore

时间:2011-11-18 09:03:12

标签: java json deserialization jackson

我有一个类,里面也有变量。有时我想忽略一些字段,有时候不反序列化(也许在序列化时)。我怎么能在杰克逊那里做到?

3 个答案:

答案 0 :(得分:22)

对于序列化,“filtering properties”博客条目应该有所帮助。反序列化方面的支持较少,因为想要过滤掉所写的东西更为常见。

一种可能的方法是子类JacksonAnnotationIntrospector,覆盖方法(和/或字段)的无知方法,以使用你想要的任何逻辑。

如果你举一个实际应用的例子,也就是说你试图阻止被反序列化的原因和原因也可能有所帮助。

答案 1 :(得分:1)

您可能想要使用JsonViews(最初从http://wiki.fasterxml.com/JacksonJsonViews获取 - 现在已损坏 - 网络存档链接:https://web.archive.org/web/20170831135842/http://wiki.fasterxml.com/JacksonJsonViews

引用它:

首先,定义视图意味着声明类;你可以重用现有的,或者只是创建虚假的类 - 它们只是带有关系信息的视图标识符(子级继承父级的视图成员资格):

 // View definitions:
  class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

  public class Bean {
            // Name is public
            @JsonView(Views.Public.class) String name;
            // Address semi-public
            @JsonView(Views.ExtendPublic.class) Address address;
            // SSN only for internal usage
            @JsonView(Views.Internal.class) SocialSecNumber ssn;
  }

使用这样的视图定义,序列化将如下所示:

 // short-cut:
  objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

  // or fully exploded:
  objectMapper.getSerializationConfig().setSerializationView(Views.Public.class);
  // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse)
  objectMapper.writeValue(out, beanInstance); // will use active view set via Config

  // or, starting with 1.5, more convenient (ObjectWriter is reusable too)
  objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
and result would only contain 'name', not 'address' or 'ssn'.

答案 2 :(得分:0)

您应该查看最近杰克逊版本的modules feature

一种可能的机制是使用BeanDeserializerModifier

我一直在寻找一个有用的在线教程或示例,但没有立即出现。如果了解您的上下文,可能会有所改进。您是在手动管理ObjectMapper,还是在JAX-RS设置中使用它们,在Spring中注入,或者是什么?