使用GSON的Java - 仅将值反序列化为JSON字符串的ArrayList

时间:2013-03-06 19:49:58

标签: java json arraylist deserialization 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 String将数字作为键,但我只想获取要放入ArrayList的值(不幸的是,JSON字符串无法通过我)。我怎样才能有效地做到这一点?

2 个答案:

答案 0 :(得分:1)

我可能会将JSON反序列化为java.util.Map,使用the Map.values() methodMap中的值作为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