2014-03-13 12 views
1

我想發送消息(使用RabbitMQ,但我認爲這不重要)。消息文本在Json中。我想在一條消息中發送關於兩個類的信息。在偵聽器網站上,我想使用Gson反序列化消息,以便再次獲取我的對象。如何在一個Json消息中發送不同類的對象,以便可以使用Gson對它們進行反序列化?

一個對象是一個簡單對象,第二個對象是一個簡單對象列表。我找不到如何連載兩個不同的對象變成一個JSON,所以我裝在他們的地圖,並提出了消息,這個地圖的:

A a = new A(); 
ArrayList<B> bList = new ArrayList<B>(); 
bList.add(new B()); 
bList.add(new B()); 

HashMap<String, Object> map = new LinkedHashMap<>(); 
map.put("A", a); 
map.put("B", bList); 

String messageText = gson.toJson(map); 

如果我現在想deserialise消息:

HashMap<String, Object> sentItems = gson.fromJson(messageText, HashMap.class); 
A a = (A) sentItems.get("A"); 
Collection<B> bList = (Collection<B>) sentItems.get("B"); 

我從符合get("A")一個例外:

com.google.gson.internal.StringMap cannot be cast to A. 

我能解決這個問題,或者我應該遵循一些其他方法來獲得我想要什麼?

編輯:

的錯誤是相同的,如果我告訴型GSON我想用:

Type type = new TypeToken<HashMap<String, Object>>() {}.getType(); 
    HashMap<String, Object> sentItems = gson.fromJson(argument.getValue(), type); 
+1

GSon如何知道你想要一個'A'的實例作爲映射值?創建一個具有'a'和'b'作爲適當類型的實例變量的*類*。 –

+0

一種選擇是將帶有對象的JSON數組發送到數組中,讀取JSON數組,然後反序列化各個數組元素;我會知道如何與傑克遜做但不是Gson ...你需要知道如何從JsonElement進行反序列化。 – fge

+0

@Marko Topolnik你是對的,但添加類型(見編輯)沒有幫助。我犯了同樣的錯誤。 – nuoritoveri

回答

1

我想你需要先反序列化「MessageText中」以JSONObject的是這樣的:

JsonElement jsonElem = gson.fromJson(messageText, JsonElement.class); 
JsonObject jsonObject = jsonElem.getAsJsonObject(); 

,然後通過他們的名字中提取元素,和反序列化到請求的類型:

JsonElement jsonA = jsonObject.get("A"); 
A a = gson.fromJson(jsonA, A.class); 

而且列表元素:

JsonElement jsonBs = jsonObject.get("B"); 
Type bListType = new TypeToken<List<B>>(){}.getType(); 
List<B> dataSetIds = gson.fromJson(jsonBs, bListType); 
1

您需要創建一個類,它包含兩個A類的變量之一,其他的是List of class B值,並反序列化這個新類。

Class Parent{ 
    private A a; 
    private ArrayList<B> bList; 

    //getter and setter method here. 
} 

在反序列化的時候,反序列化JSON字符串類Parent對象,得到getter方法的abList值,如下所示:

Parent p = gson.fromJson(messageText, Parent.class); 
A a = p.getA(); 
ArrayList<B> bList = p.getBList();  

編輯:
的名稱類Parent中的變量即abList與另一側的HashMap map的密鑰相同。在你的情況下,它應該是A而不是aB而不是bList

+0

我認爲你是對的,但我不想做這樣的課,因爲它沒有語義上的合理性。 – nuoritoveri

相關問題