2013-03-06 60 views
0

我有我的JSON響應字符串的這種結構的ArrayList:與Java GSON - 反序列化只值成JSON字符串

{ 
    "1":{ 
     "data1":"1","data2":"test1", ... 
    }, 
    "2":{ 
     "data1":"6","data2":"test2", ... 
    }, 
    ... 
} 

而且我想要得到的投入的ArrayList<MyItem>。我用GSON,通常我可以這樣做:

ArrayList<MyItem> items = 
    gson.fromJson(jsonString, new TypeToken<ArrayList<MyItem>>() {}.getType()); 

的問題是,這是行不通的,因爲我的JSON字符串中有數字作爲鍵,但我只想要得到的值投入ArrayList(不幸的是,我自己無法更改JSON字符串)。我怎樣纔能有效地做到這一點?

+1

爲什麼不嘗試把JSON轉換成'地圖<整數,ArrayList的> map'然後'列表 map = foreach(..)'? – 2013-03-06 19:55:56

回答

1

我可能會反序列化JSON成java.util.Map,您可以通過Map值作爲使用the Map.values() method一個Collection,然後使用the constructor that takes a Collection創建一個新的ArrayList

+0

我是這樣做的。我想,有一個更好的解決方案,但我也沒有找到一個。 – Tim 2013-03-06 21:44:40

0

寫一個自定義的反序列化器。

class MyItem 
{ 
    String data1; 
    String data2; 
    // ... 
} 

class MyJSONList extends ArrayList<MyItem> {} 

class MyDeserializer implements JsonDeserializer<MyJSONList> 
{ 
    public MyJSONList deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) 
     throws JsonParseException 
    { 
     MyJSONList list = new MyJSONList(); 
     for (Entry<String, JsonElement> e : je.getAsJsonObject().entrySet()) 
     { 
      list.add((MyItem)jdc.deserialize(e.getValue(), MyItem.class)); 
     } 

     return list; 
    } 

} 

例子:

String json = "{\"1\":{\"data1\":\"1\",\"data2\":\"test1\"},\"2\":{\"data1\":\"6\",\"data2\":\"test2\"}}"; 
Gson g = new GsonBuilder() 
      .registerTypeAdapter(MyJSONList.class, new MyDeserializer()) 
      .create(); 
MyJSONList l = g.fromJson(json, MyJSONList.class); 


for (MyItem i : l) 
{ 
    System.out.println(i.data2); 
} 

輸出:

test1的
test2的