0

我的 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 字符串)。我怎样才能有效地做到这一点?

4

2 回答 2

1

我可能会将 JSON 反序列化为 a ,使用方法从as ajava.util.Map获取值然后使用带有 a 的构造函数创建一个新MapCollectionMap.values()ArrayListCollection

于 2013-03-06T21:13:49.033 回答
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);
}

输出:

测试1 测试
2

于 2013-03-06T22:26:57.377 回答