2013-01-01 169 views
6

傑克遜自定義序列化我有一對夫婦的POJO,看起來像這樣:下彈簧3 MVC

class Items { 
    List<Item> items; 

    public List<Item> getItems() { 
     return items; 
    } 

    ... 
} 

class Item { 
    String name; 
    Date insertionDate; 

    ... 
} 

我希望能夠使用自定義格式序列化ItemDate場(添加一個前綴迄今爲止,像「日期:XXX」),但我不想這樣做,總是(因爲它是用來通過其他消費者不需要這個前綴),只有在特定情況下。

如果我註釋ItemgetInsertionDate()@JsonSerialize(using = CustomDateSerializer.class)我也許可以做這項工作,但是,我不想這樣做,因爲我不總是想用這種方法來序列化這個領域,只在特定情況下。

因此理想情況下,我會做這在我的控制器,並希望自定義序列化:

@JsonSerialize(using = CustomDateSerializer.class) 
public List<Item> getItems() { 
    .... 
} 

其中CustomDateSerializer extends SerializerBase<Date>和傑克遜會弄清楚,它應該在List使用默認的序列序列的每個項目,當它碰到一個Date對象時,它應該使用我的自定義序列化程序。當然,這也不行,因爲那不是如何@JsonSerialize被使用,但有什麼辦法,使這項工作以外的其他用包裝材料包裹Item和使用的包裝時,我想自定義序列?我在想這是錯誤的方式,還有另一種方法可以做到這一點?

請注意,我使用Spring MVC的,所以我不會直接調用序列化。

任何幫助,將不勝感激:)

回答

2

的問題是,傑克遜並沒有看到getItems()註釋,如果它是一個服務端點法;它通常只通過Spring確定的類型List<Item>。使用JAX-RS(如Jersey),傳遞與該方法相關的註釋,但是(也許Spring也有某種方法);儘管它需要來自集成代碼(用於JAX-RS,Jackson JAX-RS JSON提供程序模塊)的更多支持才能通過它。

實際創建一個單獨的POJO(而不是通過List類型)可能更容易,因此您可以添加必要的註釋。

如果你直接使用傑克遜,你也可以使用ObjectWriter並指定默認的日期格式使用。但我不知道,如果Spring允許你這樣做(大多數框架不只有揭露ObjectMapper可配置)。

還要說明一點 - 而不是自定義序列化(和/或解串器),你也可以使用簡單的註釋與Date S(和傑克遜2.X):

public class DateStuff { 
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="'Date:'yyyy'-'MM'-'dd") 
    public Date date; 
} 

每個屬性指定格式覆蓋。

+0

一個問題:如果我創建一個單獨的POJO,而不是名單,我可以標註它在某種程度上這種格式應用於其持有列表中的所有日期,或者我需要分別標註每個Date對象? – TheZuck

+0

您可以註釋列表屬性,它應該適用於所有包含的日期(等)。 – StaxMan

+0

我來試試,當我移動到2.0+,目前1.9.7和2.0+是不是在標準Maven倉庫呢。感謝您的幫助! – TheZuck