2015-02-06 68 views
3

我有一個很簡單的傑克遜代碼反序列化嵌套JSON對象:如何更改Jackson的默認混凝土地圖類型?

public class MapTest 
{ 
    public static void main(String ... args) throws Exception 
    { 
    final String ser = "{\"nested\":{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}}"; 
    final Map<String, Object> deser = new ObjectMapper().readValue(ser, new TypeReference<TreeMap<String, Object>>(){}); 
    System.out.println("Class of deser's nested object is " + deser.get("nested").getClass().getSimpleName()); 
    } 
} 

當運行此我得到以下輸出:

Class of deser's nested object is LinkedHashMap 

但是我想嵌套地圖被反序列化一個TreeMap而不是一個LinkedHashMap根據輸出。如何在反序列化時告訴Jackson默認使用TreeMap

通過文檔閱讀中,我發現通過addAbstractTypeMapping()一個模塊中定義的抽象類型的具體類的能力,但我試過,試圖做到這一點的LinkedHashMap每一個超類和實例,似乎沒有任何工作最接近。

這是使用傑克遜2.4.2,但如果有辦法做到這一點,需要更高的版本,我將能夠升級。

回答

0

模塊的addAbstractTypeMapping()確實是一般實現映射的方式。但問題可能是由於反序列化的遞歸性質;因爲內部值被認爲是java.lang.Object類型。

但是,我認爲在2.5中對這部分確實有修復,所以我會專門檢查2.5.0是否可行,一旦將抽象映射從Map添加到TreeMap。 如果這不起作用,請在https://github.com/FasterXML/jackson-databind/issues上提交錯誤,因爲它應該起作用。

+0

用2.5.0試過,結果相同;根據要求發佈錯誤。 – jgm 2015-02-07 08:34:41

+0

謝謝。我希望事情變得容易解決,因爲這是應該以您使用它的方式工作的。 – StaxMan 2015-02-09 22:06:23

+0

FWIW,這個 - https://github.com/FasterXML/jackson-databind/issues/700 - 是問題所在,它將在Jackson 2.6中修復(難以回溯,因爲問題對於' java.lang.Object',又名「untyped」映射) – StaxMan 2015-02-13 19:40:48