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

2022-08-31 08:26:32

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

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

我知道我可以用以下公式获取数组:"servers"

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

现在我想把它解析成一个...JsonArrayjava.util.List

最简单的方法是什么?


答案 1

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

此函数的实现适用于需要反序列化为任何参数化类型(例如,任何列表)的情况,该类型来自Json(JsonElement json,Type TypeOfT)。

在你的例子中,你只需要获取 type of a,然后将 JSON 数组解析为该数组,如下所示:List<String>Type

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

在你的例子中是一个JsonElement,但它也可以是一个字符串,任何阅读器JsonReaderyourJson

您可能想看看Gson API文档


答案 2

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

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

}

输出

List size is : 4

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