我有我的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 String将数字作为键,但我只想获取要放入ArrayList
的值(不幸的是,JSON字符串无法通过我)。我怎样才能有效地做到这一点?
答案 0 :(得分:1)
我可能会将JSON反序列化为java.util.Map
,使用the Map.values()
method将Map
中的值作为Collection
获取,然后创建一个新的{{1}使用the constructor that takes a Collection
。
答案 1 :(得分: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