Java 如何只包含Jackson要序列化的对象的某些属性和字段?

Java 如何只包含Jackson要序列化的对象的某些属性和字段?,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我有一个需要序列化的类,它包含很多属性和字段,但我只需要序列化一小部分,而不是整个类。我还想保证,我不会在将来无意中添加将被序列化的字段,也不会因为突然包含新内容而打破我对序列化内容的期望 那么,我是否可以使用任何注释来基本上指定仅序列化的内容 我需要@jsonignoreperties的反面。充当白名单而不是黑名单的东西。没有这样的注释,您必须对不需要的属性使用@JsonIgnoreProperties。您可以从类中引入一个新类 MyClass您的原始类 MyClassForJson您选择的具

我有一个需要序列化的类,它包含很多属性和字段,但我只需要序列化一小部分,而不是整个类。我还想保证,我不会在将来无意中添加将被序列化的字段,也不会因为突然包含新内容而打破我对序列化内容的期望

那么,我是否可以使用任何注释来基本上指定仅序列化的内容


我需要@jsonignoreperties的反面。充当白名单而不是黑名单的东西。

没有这样的注释,您必须对不需要的属性使用
@JsonIgnoreProperties

您可以从类中引入一个新类

MyClass
您的原始类

MyClassForJson
您选择的具有属性的类的分支

仅将第二类用于序列化。也许你可以在序列化之前进行强制转换。
这样,您的json就不会发生意外的更改。

还没有对此进行测试,但您应该能够禁用JsonAutoDetect,然后手动注释每个属性


请参见

到目前为止,我更喜欢使用包装器对象来实现此白名单效果(在我的情况下,额外的复杂性是,我要有选择地序列化的POJO是对象层次结构的一部分,因此不可能使用视图)

如果
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();
    }
}
现在,无论我向
MyClass
添加了多少属性,序列化时只有我为其创建委托getter方法的属性才会暴露给Jackson。目前大多数IDE都可以为包装类的选定属性自动生成委托方法


如果我想用不同的方式序列化
MyClass
的不同白名单属性集,我所要做的就是创建不同的包装类。

我能够使用
@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);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
如果不希望在JSON中定义没有视图的属性,请确保配置
ObjectMapper

mapper.writerWithView(clazz);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

@NeilMcGuigan它对我不起作用,因为我需要在要序列化的类上指定它,而不是在ObjectMapper上。也许你可以使用
模块
和mixin?我确认它可以与
@JsonAutoDetect(getervisibility=Visibility.NONE)
@JsonProperty