2013-01-16 23 views
14

Trong dự án hiện tại của tôi, tôi sử dụng thư viện GSON trong android và tôi đã gặp phải sự cố về deserializtion của Maps lồng nhau. Đây là cách ban đầu json trông giống nhưGoogle GSON lồng nhau HashMaps deserialization

{ 

"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", 

     } 
    } 
    } 
} 

Và POJO tôi

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

Và Flower lớp

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

Nhưng khi tôi cố gắng để deserialize đối tượng này, tôi có thể truy cập vào hashmaps lồng nhau, các mã mẫu là

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(); 
     } 

    } 
} 

Bất kỳ đề xuất nào?

Trả lời

28

gson.fromJson(br, HashMap.class); này nói với Gson rằng bạn muốn deserialize vào một Bản đồ của loại giá trị không xác định. Bạn sẽ bị cám dỗ để xác định một cái gì đó như Map<String,Category>.class, nhưng bạn không thể làm điều này trong Java để giải pháp là sử dụng những gì họ gọi là TypeToken trong Gson.

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

Có, tôi đã bỏ lỡ TypeTokens trong mã của mình, sau khi sửa tất cả hoạt động hoàn hảo. Cảm ơn –

+0

Cảm ơn .. Đây là chính xác những gì tôi đang tìm kiếm kể từ nửa giờ cuối cùng :) – Arjun