2014-09-06 44 views
0

我在Spring MVC項目中使用Jackson 2.3.2庫,並試圖通過實現JSONSerializableWithType接口指定自定義包裝對象上的自定義JSON序列化其中包括在嘗試將對象實例序列化爲JSON時被Jackson調用的名爲serialize()的方法。爲什麼不使用serialize()自定義包裝類的方法擴展LinkedHashMap

奇怪的是,只要我的對象包裝不擴展LinkedHashMap < ...>,就可以正確調用這個序列化方法。 如果我的對象包裝擴展了一個傑克遜「知道」如何以默認方式序列化的類,則不再調用serialize()方法。

我的包裝類看起來是這樣的:

public class ResponseRoomOccupancy 
    extends LinkedHashMap<...> 
    implements org.codehaus.jackson.map.JsonSerializableWithType { 

    @Override 
    public void serialize(JsonGenerator jgen, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 

     jgen.writeStartObject(); 
     // actual serialization of the object 
     jgen.writeEndObject(); 
    } 

    @Override 
    public void serializeWithType(JsonGenerator jgen, 
      SerializerProvider provider, TypeSerializer typeSer) 
      throws IOException, JsonProcessingException { 
     serialize(jgen, provider); 
    } 
} 

控制器:

@RequestMapping(value = "/occupancy") 
public @ResponseBody ResponseRoomOccupancy 
getRoomOccupancy(RequestRoomOccupancy request) { 

    return appointmentService.getEnrichedRoomOccupancy(request); 
} 

任何人都可以向我解釋爲什麼傑克遜不使用自定義的序列化方法在延伸的LinkedHashMap類?

UPDATE

作爲索蒂里奧斯扎Delimanolis正確地指出的那樣,JSONSerializableWithType接口是較舊版本的傑克遜(< 1.9)的一部分。 但我不知道爲什麼這種自定義序列化與自定義類的工作(例如,如果LinkedHashMap與某些類Foo < ...>交換)。

回答

0

您正在使用Jackson 2,其中is completely incompatible with Jackson 1.JsonSerializableWithType是來自Jackson 1的界面。您不能讓它們一起使用。傑克遜2根本不尋找JsonSerializableWithType

相反,與

@JsonSerialize(using = YourSerializer.class) 

註解你LinkedHashMap類型,並有YourSerializer做的工作。

關於你的評論和編輯,傑克遜有已知類型,像ListSetStringNumberMap一些默認的串行器/解串器。但是,它不知道您的自定義類型。它必須基於從分析類型中找到的內容來構建新的序列化程序。

+0

好的,這是正確的。但我無法弄清楚,爲什麼它可以與自定義類一起工作。我更新了這個問題。 – juffel 2014-09-11 09:59:41

+0

@juffel看我的編輯。 – 2014-09-11 14:27:06

+0

我認爲傑克遜的這種行爲並不是非常一致。 – juffel 2014-09-12 15:01:50

相關問題