2016-11-12 127 views
0

我正嘗試反序列化一個JSON成階類,它包含類型ACLASS,Bclass或Cclass傑克遜反序列化與泛型

class Results[M](results:util.ArrayList[M]) { 

    def getResults:util.ArrayList[M]=results 

    def this() { 
    this(new util.ArrayList()) 
    } 
} 

JSON的樣子的集合:

{ "results":[{"a":1},{"a":1}]} 

{ "results":[{"b":1},{"b":1}]} 

{ "results":[{"b":1},{"b":1}]} 

這裏我對象映射

val mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

在這裏,我如何反序列化類類型的JSON ACLASS

val results = mapper.readValue(json, classOf[Results[Aclass]]) 

的問題是,結果,返回一個ArrayList中,每一個元素,而不是成爲一個實例Aclass,是一個LinkedHashMap

如果我改變代碼,而不是使用通用I使其在類型

class Results[Aclass](results:util.ArrayList[Aclass]) { 

    def getResults:util.ArrayList[Aclass]=results 

    def this() { 
    this(new util.ArrayList()) 
    } 
} 

它的工作原理,並與ACLASS元素的數組的結果返回一個類明確。

我在這裏做錯了什麼?我認爲這是庫中的一個錯誤

此致。

+0

你堅持與傑克遜或是否也能使用一個庫,這不是反射型(例如瑟茜或淘金者)? – Reactormonk

+0

完全打開使用新的庫,如果不需要太多的代碼,並實現我想要的。但無論如何,我設法使它使用TypeFactory,但仍然不是很高興我的解決方案看起來多麼複雜 – paul

回答

2

原因是java.lang.Class不包含有關通用參數的信息。 classOf[Result[Aclass]]的值是java.lang.Class。它沒有關於類型參數Aclass的信息。它僅代表Results類。

該映射器可以做你要求的:給你Results任何東西,最好的是它是一張地圖。

要解決該問題,請使用取代JavaType的readValue方法。 JavaType可以使用TypeFactory創建:

val results:Results[Aclass] = mapper.readValue(json, mapper.getTypeFactory() 
     .constructParametricType(classOf[Results[_]], classOf[Aclass])) 
+0

似乎它不能反序列化任何東西。 java.lang.ClassCastException:politrons.apple.search.model.Results不能轉換爲scala.runtime.Nothing $ – paul

+0

對不起,忘了將類型聲明添加到val結果中。沒有它,類型被推斷爲Nothing在運行時顯然是不正確的。這是由於readValue方法的此重載的未綁定類型參數。我剛剛更新了答案。 – ondrc

+0

最後,我最終得到另一種解決方案,使用Play json,但謝謝! – paul