Jackson Change JsonIgnore Dynamicly
2022-09-01 02:43:31
我有一个类,里面也有变量。有时我想忽略一些字段,有时在反序列化时不忽略(也许在序列化时也是如此)。我怎样才能在杰克逊做到这一点?
我有一个类,里面也有变量。有时我想忽略一些字段,有时在反序列化时不忽略(也许在序列化时也是如此)。我怎样才能在杰克逊做到这一点?
对于序列化,“筛选属性”博客文章应该会有所帮助。反序列化端的支持较少,因为更常见的是想要过滤掉所写的内容。
一种可能的方法是子类 ,覆盖那些自省方法(和/或字段)的可忽略性的方法,以使用您想要的任何逻辑。JacksonAnnotationIntrospector
如果您给出一个实际应用的示例,即您试图防止被反序列化的内容和原因,也可能有所帮助。
你可能想使用JsonViews(最初来自 http://wiki.fasterxml.com/JacksonJsonViews - 现在坏了 - Web存档链接: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'.