Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java with GSON—仅将值反序列化为JSON字符串的ArrayList_Java_Json_Arraylist_Deserialization_Gson - Fatal编程技术网

Java with GSON—仅将值反序列化为JSON字符串的ArrayList

Java with GSON—仅将值反序列化为JSON字符串的ArrayList,java,json,arraylist,deserialization,gson,Java,Json,Arraylist,Deserialization,Gson,我的JSON响应字符串的结构如下: { "1":{ "data1":"1","data2":"test1", ... }, "2":{ "data1":"6","data2":"test2", ... }, ... } 我想得到要放入ArrayList的值。我使用GSON,通常我可以这样做: ArrayList<MyItem> items = gson.fromJson(jsonString, new

我的JSON响应字符串的结构如下:

{
    "1":{
        "data1":"1","data2":"test1", ...
    },
    "2":{
        "data1":"6","data2":"test2", ...
    },
    ...
}
我想得到要放入
ArrayList
的值。我使用GSON,通常我可以这样做:

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

问题是,它不起作用,因为我的JSON字符串以数字作为键,但我只想获取要放入
ArrayList
的值(不幸的是,JSON字符串不能由我自己更改)。如何有效地做到这一点?

我可能会将JSON反序列化为
java.util.Map
,使用
Map
作为
集合获取值,然后使用创建一个新的
ArrayList

编写一个自定义反序列化程序

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;
    }

}
输出:

测试1
测试2


为什么不尝试将json放入
Map
,然后再
List Map=foreach(…)
?我就是这样做的。我想,有更好的解决办法,但我也没有找到。
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);
}