我有一个我需要序列化的类,它包含很多属性和字段,但我只需要一个小的子集来序列化,而不是整个类。我还要保证,我将来不会无意中添加将被序列化的字段,并且突破我对通过突然包含新内容而被序列化的期望。
那么我可以使用任何注释来基本指定仅序列化的内容吗?
我需要和@JsonIgnoreProperties相反。作为白名单而不是黑名单的东西。
答案 0 :(得分:1)
没有这样的注释,你必须在你不想要的属性上使用@JsonIgnoreProperties
。
答案 1 :(得分:1)
您可以在课堂上介绍一个新课程。
MyClass
您原来的课程
MyClassForJson
你班上有你选择属性的分叉。
仅使用第二类进行序列化。也许你可以在序列化之前进行转换。 这样你的json就不会发生意外的变化。
答案 2 :(得分:1)
尚未对此进行测试,但您应该能够禁用JsonAutoDetect,然后手动注释每个属性。
答案 3 :(得分:0)
到目前为止,我更喜欢使用包装器对象来实现这种白名单效果(在我的情况下,额外的复杂性是我想要选择性地序列化的POJO是对象层次结构的一部分,因此不可能使用Views。)
如果MyClass
是原始类,而MyClassForJson
是包装器,那就是我使用它的方式:
public class MyClassForJson {
private MyClass wrapped;
public MyClassForJson(MyClass toBeWrapped) {
this.wrapped = toBeWrapped;
}
/**
* Delegate method exposing a property
*/
public String getExposedProperty() {
return this.wrapped.getExposedProperty();
}
}
现在只有我创建委托getter方法的属性才会在序列化时暴露给Jackson,而不管我向MyClass
添加了多少属性。今天大多数IDE都可以为包装类的选定属性自动生成委托方法。
如果我希望以不同的方式使用不同的白名单属性集来序列化MyClass
,我所要做的就是创建不同的包装类。
答案 4 :(得分:0)
我可以使用@JsonView
注释使它生效。
用于指示视图的注释,该视图由方法或由字段注释定义的属性是其中的一部分。
您可以对视图使用任何类,但是我更喜欢在一个位置创建它们:
public class JsonViews {
public static class Small {}
public static class Medium extends Small {}
}
然后在课堂上:
public class User {
@JsonView(JsonViews.Small.class)
private Integer id;
@JsonView(JsonViews.Medium.class)
private String name;
// email does not have a view, by default it will be in any view
private String email;
...
}
然后我们可以将视图类传递到ObjectMapper
mapper.writerWithView(clazz);
如果您不希望在JSON中定义未定义视图的属性,请确保配置ObjectMapper
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);