jackson动态改变JsonIgnore

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

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

一种可能的方法是对JacksonAnnotationIntrospector进行子类化,重写方法可以反省方法(和/或字段)的无知性,以使用您想要的任何逻辑。

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

您可能想要使用JsonViews http://wiki.fasterxml.com/JacksonJsonViews

引用它:

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

  // 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'. 

您应该查看最近Jackson版本的模块function 。

一种可能的机制是使用BeanDeserializerModifier 。

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