![](/img/trans.png)
[英]Jackson: how to wrap object with a key, which is one of the properties of serialized object?
[英]How to include only certain properties and fields of my object to be serialized by Jackson?
我有一個class需要序列化,它包含了很多屬性和字段,但是我只需要序列化一小部分,而不是整個class。我也想保證以后不會不小心添加字段這將被序列化並打破我對突然包含新內容的序列化內容的期望。
那么我可以使用任何注釋來基本上指定僅序列化的內容嗎?
我需要與@JsonIgnoreProperties 相反的東西。 充當白名單而不是黑名單的東西。
尚未對此進行測試,但您應該能夠禁用 JsonAutoDetect,然后手動注釋每個屬性。
沒有這樣的注釋,您必須在@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。
對於想要為特定 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.