2013-01-16 119 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