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

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

{
"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()

现在我要把这个 JsonArray解析成一个 java.util.List

最简单的方法是什么?

223275 次浏览

下面的代码是使用 com.google.gson.JsonArray。 我已经打印了 List 中的元素数和 List 中的元素数

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]

绝对最简单的方法是使用 Gson 的默认解析函数 fromJson()

这个函数的一个实现适合于当您需要反序列化到任何 ParameterizedType(例如,任何 List)时,即 fromJson(JsonElement json, Type typeOfT)

在您的示例中,您只需获取 List<String>Type,然后将 JSON 数组解析为 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);

在你的案例中,yourJson是一个 JsonElement,但它也可以是一个 String,任何 ReaderJsonReader

你可能想看看 Gson API 文档

我从 Gson 的官方网站上阅读了解决方案

你的密码是:

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

监测结果显示:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

我能够使用 @SerializedName来处理所有字段的列表映射。.没有围绕 Type的逻辑是必要的。

通过调试器运行代码 在下面的第4步,我能够观察到用 JSON 数据填充的 List<ContentImage> mGalleryImages对象

这里有一个例子:

1. JSON

   {
"name": "Some House",
"gallery": [
{
"description": "Nice 300sqft. den.jpg",
"photo_url": "image/den.jpg"
},
{
"description": "Floor Plan",
"photo_url": "image/floor_plan.jpg"
}
]
}

具有 List 的 Java 类

public class FocusArea {


@SerializedName("name")
private String mName;


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

3. List 项的 Java 类

public class ContentImage {


@SerializedName("description")
private String mDescription;


@SerializedName("photo_url")
private String mPhotoUrl;


// getters/setters ..
}

4. 处理 JSON 的 Java 代码

    for (String key : focusAreaKeys) {


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

假设你从 mapping.get("servers").getAsJsonArray()开始,如果你能访问 番石榴 Streams,你可以做下面的一行程序:

List<String> servers = Streams.stream(jsonArray.iterator())
.map(je -> je.getAsString())
.collect(Collectors.toList());

注意,StreamSupport不能在 JsonElement类型上工作,因此它是不够的。

Kotlin 分部

对于 Kotlin 的开发者,你可以使用这个扩展

inline fun <reified T> String.convertToListObject(): List<T>? {
val listType: Type = object : TypeToken<List<T?>?>() {}.type
return Gson().fromJson<List<T>>(this, listType)
}