2014-09-30 156 views
-1

我有一個Java web服務響應作爲一個對象,它具有一個整數作爲鍵和自定義對象作爲值的映射。自定義對象又由另一個自定義對象的列表組成。當我嘗試反序列化響應時,除了自定義對象列表之外,所有內容都是反序列化的。該列表是空的。反序列化Java中的JSON對象

我的代碼:

String dataFromServer =""; 
GsonBuilder gsonBuilder = new GsonBuilder(); 
Gson gson = gsonBuilder.create(); 
Type listType = new TypeToken<OuterCustomResponse>() {}.getType(); 


OuterCustomResponse respo = gson.fromJson(data, Books.class); 

OuterCustomResponse具有以下結構:

OuterCustomResponse { 
    private int age; 
    private String name; 
    private Map<Integer,CutomObj1> obj; 
} 

CtomObj1 { 
    List<CustomObj2> customObj2; 
} 

的問題是響應包含年齡,姓名和地圖對象,但地圖對象中,名單空。我嘗試通過實現JSON解串器來編寫CustomObj2的解串器,但沒用。任何幫助表示讚賞。

+0

'CustomObj1'類是否實現'Serializable'?也許,如果沒有,就不可能序列化它,並且你得到錯誤的輸出。 – Victor 2014-09-30 19:09:42

+0

我試圖在customobj1中實現implmnting srializablr,但沒有運氣。但customobj1具有其他字符串和intgr屬性,這些屬性可以被正確地獲取。 – parameswar 2014-09-30 19:14:43

+0

好的,所以你的問題只有'CustomObj2'?你裏面有什麼?它也是'Serializable'嗎? – Victor 2014-09-30 19:16:46

回答

0

這對一些示例JSON會更好。 (你有一個錯字有我猜以及CtomObj1 {...

也許customObj2不是一個對象,而不是一些原始類型(?不可能OK)或您的列表是一個關聯數組(=對象),因此你」有一個複雜的對象,而不是一個列表/數組?

如果它是一個關聯數組(〜對象),只是看起來像一個列表:

OuterCustomResponse { 
    age:3, 
    name:"foo", 
    map:{ 
    1:{ 
     listitem1a:{...}, 
     listitem2a:{...}}, 
    2:{}, 
    ... 
}} 

你可能有這3個選項中進行選擇,以一般反序列化:https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types

如果它是一個列表確實((索引)陣列):

OuterCustomResponse { 
    age:3, 
    name:"foo", 
    map:{ 
    1:[ 
     { listitem1propertyA: "bar" }, 
     { listitem2propertyB: "baz" } 
    ], 
    2:[], 
    ... 
}} 

列表項可以是相同或不同的類型。

如果它們是相同類型,則您的方法應該可以正常工作,前提是listitem1propertyA已正確映射到CustomObj2.listitem1propertyA字段。

如果它們不是同一類型(或有可能只有一個例外對象不匹配的 - 我不知道這是否會導致一個空表),你又得從上面的選項中進行選擇。