簡體   English   中英

用Jackson以兩種不同的方式序列化一個班級

[英]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.

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