2013-01-16 158 views
14

在我目前的項目中,我在android中使用GSON庫,並且我遇到了嵌套Maps反序列化問題。這是JSON如何最初看起來像谷歌GSON嵌套HashMaps反序列化

{ 

"5":{ 
    "id":5, 
    "name":"initial name", 
    "image_url":"uploads/71d44b5247cc1a7c56e62fa51ca91d9b.png", 
    "status":"1", 
    "flowers":{ 
     "7":{ 
      "id":7, 
      "category_id":"5", 
      "name":"test", 
      "description":"some description", 
      "price":"1000", 
      "image_url":"uploads/test.png", 
      "status":"1", 
      "color":"red", 

     } 
    } 
    } 
} 

我的POJO的

class Category { 
long id; 
String name; 
String image_url; 
HashMap<String,Flower> flowers; 
} 

和花類

class Flower { 
long id; 
String category_id; 
String name; 
String description; 
String price; 
String image_url; 
String status; 
} 

但是當我嘗試反序列化這個目標,我可以訪問嵌套包含HashMap中,示例代碼是

public class TestJson { 
public static void main(String[] args) { 
    Gson gson = new Gson(); 
    try { 
    BufferedReader br = new BufferedReader(
     new FileReader("2.txt")); 
    HashMap<String,Category> map = gson.fromJson(br, HashMap.class); 
    Collection<Category> asd = map.values(); 
      System.out.println(map.values()); 

     } catch (IOException e) { 
     e.printStackTrace(); 
     } 

    } 
} 

有什麼建議嗎?

回答

28

這個gson.fromJson(br, HashMap.class);告訴Gson你想反序列化爲未知值類型的地圖。你會試圖指定類似Map<String,Category>.class的東西,但是你不能在Java中這樣做,所以解決方案是在Gson中使用他們所謂的TypeToken。

Map<String, Category> categoryMap = gson.fromJson(br, new TypeToken<Map<String, Category>>(){}.getType()); 
+0

是的,我已經錯過了我的代碼中的TypeTokens,修復後的所有作品完美。謝謝 –

+0

謝謝..這正是我要找的,因爲最後一個半小時:) – Arjun