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


119

我有一个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...

最简单的方法是什么?



2
@ruakh这个问题和这个问题有很多不同。这个处理Gson
Abel Callejo

@AbelMelquiadesCallejo看看答案。希望它能解决您的问题。
2013年

@ruakh是的,我同意你的看法,我知道JsonArray工具Iterable。只是我还在寻找新的方法,而不是添加新的库。
Abel Callejo

Answers:


272

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

此功能的实现适用于需要反序列化为任何ParameterizedType(例如any List)的情况fromJson(JsonElement json, Type typeOfT)

在您的情况下,您只需要获取的TypeList<String>然后将JSON数组解析为that 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);

在您的情况下yourJsonJsonElement,但也可能是String,任何ReaderJsonReader

您可能需要看一下Gson API文档


7
Type可以在什么包装中找到?
Abel Callejo

10
Type是软件包中的Java内置接口java.lang.reflect
MikO,2013年

我不得不使用getString(),而不是get()要不.fromJson()抱怨。
lenooh

@MikO我在这里与Gson有类似的问题。我想看看你能不能帮到我。我确实有解决方案,但问题是仅将JSON解析为Map看起来就很混乱。
约翰

18

下面的代码正在使用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]

8

我在这里从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

与上述相同的答案–仍使用静态方法new Gson().fromJson()
Abel Callejo

好吧,我的问题是其他问题,但是您的代码片段解决了我的问题。我存储了字符串列表,但我想获取字符串。然后您的代码片段让我想起了我可以将String []。class放入以获取数据的过程。谢谢
badarshahzad

2

我能够使列表映射仅@SerializedName用于所有字段就可以使用Type

通过调试器运行代码(在下面的第4步中),我可以观察到该List<ContentImage> mGalleryImages对象填充了JSON数据

这是一个例子:

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"
      }
    ]
  }

2. Java类与列表

public class FocusArea {

    @SerializedName("name")
    private String mName;

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

3.列表项的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);
    }

0

从开始开始mapping.get("servers").getAsJsonArray(),如果您可以访问Guava Streams,则可以执行以下单线操作:

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

注意StreamSupport无法在JsonElement类型上使用,因此不够。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.