如何仅包含我的对象的某些属性和字段以供Jackson序列化?

时间:2015-01-07 19:07:41

标签: java json serialization jackson

我有一个我需要序列化的类,它包含很多属性和字段,但我只需要一个小的子集来序列化,而不是整个类。我还要保证,我将来不会无意中添加将被序列化的字段,并且突破我对通过突然包含新内容而被序列化的期望。

那么我可以使用任何注释来基本指定仅序列化的内容吗?

我需要和@JsonIgnoreProperties相反。作为白名单而不是黑名单的东西。

5 个答案:

答案 0 :(得分:1)

没有这样的注释,你必须在你不想要的属性上使用@JsonIgnoreProperties

答案 1 :(得分:1)

您可以在课堂上介绍一个新课程。

MyClass您原来的课程

MyClassForJson你班上有你选择属性的分叉。

仅使用第二类进行序列化。也许你可以在序列化之前进行转换。 这样你的json就不会发生意外的变化。

答案 2 :(得分:1)

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

请参阅http://wiki.fasterxml.com/JacksonFeatureAutoDetect

答案 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注释使它生效。

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);