2012-11-13 73 views
2

我有一個Message類是這樣的:如何將對象類與傑克遜發送到服務器?

class Message { 
    @JsonProperty("content") 
    Object content; 
} 

其中的內容屬性可以是User,一個Post,或String ,我有這個對象發送到服務器,並投了內容的權利類。

我使用Jackson註釋來序列化JSON,但是當我嘗試轉換內容時,出現錯誤,因爲屬性內容像LinkedHashMap對象一樣到達服務器。

的錯誤是:

ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/MegaRadarSocial].[Resteasy]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Resteasy threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to br.com.megaradar.megaradarsocial.model.User 

我想幫助鑄造... 感謝

+0

請發佈您的代碼的所有相關部分。你使用什麼傑克遜註釋?你會得到什麼錯誤? – 2012-11-13 14:10:28

+0

傑克遜不做基於內容的反序列化。你將不得不處理傳入的JSON到你自己的類型的映射。 – Perception

+0

我該如何做這張地圖?你能告訴我正確的方法嗎? –

回答

0

謝謝你的所有答案。但我發現另一種方法來將我的對象轉換爲我想要的任何類型。 我使用ObjectMapper對象的方法convertValue。然後,我可以模擬鑄件。

再次感謝

0

當你控制兩端(服務器和客戶端),你可以嘗試Genson庫http://code.google.com/p/genson/。它的一個功能允許您序列化爲json和類型信息,這使您能夠反序列化回正確的類型。

Genson genson = new Genson.Builder().setWithClassMetadata(true).create(); 
json = genson.serialize(yourMessage); 

// then deserialize it back 
Message message = genson.deserialize(json, Message .class); 

序列化JSON看起來像:{ 「內容」:{ 「@class」: 「package.path.Message」,...對象值...}}

你可以甚至定義別名序列化類

new Genson.Builder().addAlias("message", Message.class) 

重要:請注意,您需要使用genson同樣配置在兩側。因此,使用setWithClassMetadata啓用類型信息,如果使用別名,則必須在客戶端定義相同的信息。

0

你需要的是@JsonTypeInfo註釋,像這樣:

class Message { 
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY property="type") 
@JsonProperty("content") 
Object content; 
} 

(你可以看到http://programmerbruce.blogspot.com/2011/05/deserialize-json-with-jackson-into.html的例子)

這將增加財產「型」與類名作爲值(有許多可供選擇當序列化時,以及在反序列化時使用該方法)。