[英]Serialize one class in two different ways with Jackson
在我們的一個項目中,我們使用java webapp與MongoDB實例進行通信。 在數據庫中,我們使用DBRefs
來跟蹤一些對象關系。 我們使用jackson(使用mongodb-jackson-mapper)使用POJO對象進行序列化。
但是,我們使用相同的POJO然后(de)序列化到外部世界,我們的前端處理呈現JSON。
現在,我們需要一種方法讓外部世界的序列化包含來自DBRef
的引用對象(以便UI可以呈現完整對象),而我們顯然希望將DBRef
寫入數據庫,而不是整個賓語。
現在我寫了一些未經測試的靜態嵌套類代碼:
public static class FooReference {
public DBRef<Foo> foo;
// FIXME how to ensure that this doesn't go into the database?
public Foo getFoo() {
return foo.fetch();
}
}
理想情況下,我想要一種方法來注釋這個,以便我可以(或)使用或不使用getFoo()結果序列化它,可能取決於一些配置對象。 這可能嗎? 你有沒有看到更好的方法來做這件事?
通過查看選項,您似乎可以注釋屬性,只有在給定的View
傳遞給用於序列化的ObjectMapper
才會顯示。 你可以編輯這個類:
public static class FooReference {
public DBRef<Foo> foo;
@JsonView(Views.WebView.class)
public Foo getFoo() {
return foo.fetch();
}
}
並提供:
class Views {
static class WebView { }
}
然后在使用正確的視圖創建配置后序列化:
SerializationConfig conf = objectMapper.getSerializationConfig().withView(Views.WebView.class);
objectMapper.setSerializationConfig(conf);
然后將序列化它。 使用MongoDB包裝器進行序列化時不指定視圖意味着該方法將被忽略。 默認情況下,沒有JsonView批注的屬性會被序列化,您可以通過指定以下內容來更改此行為:
objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);
更多信息可在Jackson Wiki上獲得 。
還有其他的選擇,事實證明:有一些Jackson MixIns可以讓你覆蓋(de)類的部分行為而不修改類本身,而且從Jackson 2.0(最近的版本)開始就有過濾器也是。
使用自定義JSONSerializer
並在serialize
方法中應用您的邏輯:
public static class FooReference {
public DBRef<Foo> foo;
@JsonSerialize(using = CustomSerializer.class)
public Foo getFoo() {
return foo.fetch();
}
}
public class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
// jgen.writeObjectField ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.