2013-03-06 97 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的