2013-01-16 21 views
14

W moim bieżącym projekcie korzystam z biblioteki GSON w systemie Android i napotkałem problem deserializacji z zagnieżdżonymi mapami. W ten sposób początkowy json wyglądaGoogle GSON zagnieżdżona deserializacja 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", 

     } 
    } 
    } 
} 

i mój Pojo za

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

I Kwiat klasa

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

Ale gdy próbuję deserializowania to przedmioty, można uzyskać dostęp zagnieżdżone hashmaps The przykładowy kod to

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

    } 
} 

Jakieś sugestie?

Odpowiedz

28

Ten gson.fromJson(br, HashMap.class); informuje Gson, że chcesz deserializować do mapy o nieznanej wartości typu. Skusiłbyś się na określenie czegoś takiego, jak Map<String,Category>.class, ale nie możesz tego zrobić w Javie, więc rozwiązaniem jest użycie tego, co nazwali TypeToken w Gsonie.

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

Tak, brakuje mi TypeTokens w moim kodzie, po poprawkach wszystko działa idealnie. Dzięki –

+0

Dzięki .. Dokładnie tego szukam od ostatniego pół godziny :) – Arjun