簡體   English   中英

如何僅包含我的 object 的某些屬性和字段以由 Jackson 序列化?

[英]How to include only certain properties and fields of my object to be serialized by Jackson?

我有一個class需要序列化,它包含了很多屬性和字段,但是我只需要序列化一小部分,而不是整個class。我也想保證以后不會不小心添加字段這將被序列化並打破我對突然包含新內容的序列化內容的期望。

那么我可以使用任何注釋來基本上指定僅序列化的內容嗎?

我需要與@JsonIgnoreProperties 相反的東西。 充當白名單而不是黑名單的東西。

尚未對此進行測試,但您應該能夠禁用 JsonAutoDetect,然后手動注釋每個屬性。

請參閱http://wiki.fasterxml.com/JacksonFeatureAutoDetect

沒有這樣的注釋,您必須在@JsonIgnoreProperties的屬性上使用@JsonIgnoreProperties

您可以從您的班級中介紹一個新班級。

MyClass你原來的班級

MyClassForJson具有您選擇的屬性的類的MyClassForJson

僅將第二類用於序列化。 也許您可以在序列化之前進行轉換。 這樣你的 json 就不會發生意外的變化。

到目前為止,我更喜歡使用包裝器對象來實現這種白名單效果(在我的情況下,額外的復雜性是我想要選擇性地序列化的 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();
    }
}

現在,只有我為其創建委托 getter 方法的屬性在序列化時才會暴露給 Jackson,無論我向MyClass添加了多少屬性。 目前,大多數 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);

如果您不希望在 JSON 中定義沒有視圖的屬性,請確保配置ObjectMapper

mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

這是一個老問題,但如果有人仍在尋找答案:

您正在搜索的功能是從 2.12 版開始實現的,稱為 @JsonIncludeProperties。

更多信息: https://fasterxml.github.io/jackson-annotations/javadoc/2.12/com/fasterxml/jackson/annotation/JsonIncludeProperties.ZFC35FDC70D52C69D2368

對於想要為特定 class 執行此操作的任何人。

正如另一個答案中指出的那樣, @JsonAutoDetect注釋就是這種方式。

然后使用@JsonProperty注釋您想要的屬性,以將它們包含在序列化中。

下面的示例,如果您像我一樣使用 lombok 或其他“吸氣劑生成”工具,請注意boolean屬性的isGetterVisibility = Visibility.NONE參數。

@JsonAutoDetect(getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE)
public class MyClass {
    @JsonProperty
    private String id;

    //list of properties without @JsonProperty, which will not be serialized
}

@JsonAutoDetect有更多選項,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM