使用Gson将JSON数组解析为java.util.List

Parsing JSON array into java.util.List with Gson

我有一个叫JsonObject"mapping",内容如下:

1
2
3
4
5
6
7
8
9
{
   "client":"127.0.0.1",
   "servers": [
       "8.8.8.8",
       "8.8.4.4",
       "156.154.70.1",
       "156.154.71.1"
    ]
}

我知道我可以用以下方法得到阵列"servers"

1
mapping.get("servers").getAsJsonArray()

现在我想把那个JsonArray解析成java.util.List

最简单的方法是什么?


当然,最简单的方法是使用GSON的默认解析函数fromJson()

当需要反序列化到任何ParameterizedType中(例如,任何List中),即fromJson(JsonElement json, Type typeOfT)时,可以使用此函数的实现。

在您的例子中,只需获取ListType,然后将json数组解析为Type,如下所示:

1
2
3
4
5
6
7
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

在你的例子中,yourJsonJsonElement,但也可以是String,任何ReaderJsonReader

您可能需要查看GSONAPI文档。


下面的代码使用的是com.google.gson.JsonArray。我已经打印了列表中元素的数目以及列表中元素的数目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str ="{"+
           ""client":"127.0.0.1"," +
           ""servers":[" +
           "    "8.8.8.8"," +
           "    "8.8.4.4"," +
           "    "156.154.70.1"," +
           "    "156.154.71.1"" +
           "    ]" +
           "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is :"+jsonObjList.size());
                    System.out.println("List Elements are  :"+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

产量

1
2
3
List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]


我在这里阅读了GSON官方网站上的解决方案

以下代码适用于您:

1
2
3
4
5
6
7
8
9
10
11
12
13
    String json ="{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }

监视器上显示的结果:

1
2
3
4
8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1


我能够让列表映射只使用@SerializedName对所有字段进行工作。没有必要在Type周围建立逻辑。

通过调试器运行下面步骤4中的代码,我可以观察到用JSON数据填充的List mGalleryImages对象

下面是一个例子:

1。JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
   {
   "name":"Some House",
   "gallery": [
      {
       "description":"Nice 300sqft. den.jpg",
       "photo_url":"image/den.jpg"
      },
      {
       "description":"Floor Plan",
       "photo_url":"image/floor_plan.jpg"
      }
    ]
  }

2。带列表的Java类

1
2
3
4
5
6
7
8
public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

三。列表项目的Java类

1
2
3
4
5
6
7
8
9
10
public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4。处理JSON的Java代码

1
2
3
4
5
    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }