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

Posted

技术标签:

【中文标题】使用 Gson 将 JSON 数组解析为 java.util.List【英文标题】:Parsing JSON array into java.util.List with Gson 【发布时间】:2013-09-03 20:18:06 【问题描述】:

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

最简单的方法是什么?

【问题讨论】:

Easy way to change Iterable into Collection 或 Convert Iterator to ArrayList 的可能重复项。 @ruakh 这个问题和这个问题有很多不同之处。这个处理Gson @AbelMelquiadesCallejo 看看答案。希望它能解决您的问题。 ***.com/a/55691694/470749 对我有帮助。 list.add(item.getAsString()); 【参考方案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);

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

您可能想看看Gson API documentation。

【讨论】:

Type 可以在什么包中找到? Type是一个Java内置接口,位于包java.lang.reflect 我必须使用getString() 而不是get() 否则.fromJson() 会抱怨。 @MikO 我和 Gson here 有类似的问题。我想看看你能不能帮帮我。我确实有一个解决方案,但问题是仅将 JSON 解析为 Map 看起来非常混乱。【参考方案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]

【讨论】:

【参考方案3】:

我从Gson官方网站here阅读解决方案

这个代码给你:

    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() 好吧,我的问题是其他问题,但您的 sn-p 解决了我的问题。我存储了字符串列表,但我想获取字符串。然后你的 sn-p 让我想起他们的我可以把 String[].class 来获取数据。谢谢【参考方案4】:

我只需要对所有字段使用@SerializedName,就可以让列表映射工作。不需要Type 周围的逻辑。

运行代码 - 在下面的第 4 步中 - 通过调试器,我可以观察到 List&lt;ContentImage&gt; 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。带有 List 的 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);
    

【讨论】:

我如何使用这种方式访问​​内容图像? @Adnanhaider,如果我理解你的问题,你想在查看器中实际加载图像吗?在此处的示例中,这就是图像 url 的用途。这是关于如何在 android ***.com/questions/5776851/load-image-from-url 中执行此操作的线程 我有两个类 1. 主要 2 列表形状类。 1个类作为父类,其属性是名称,id,地址,2个类子类,其中子类名称,类名,学校名称等现在在模型类中设置getter setter后,我从json mvvm方法获取数据,我想访问getter子类,我只访问父类而不是子类,这让我头疼了 2 天仍然没有找到答案。那么我如何访问已经作为 arraylist 的子类的属性。 @Adnanhaider,我之前没看到这条消息,今天才看到。这听起来像是一个不平凡的设置。我建议创建一个新帖子,并在干净的块中列出最少的代码,以演示您正在使用什么以及您希望它做什么【参考方案5】:

假设您以mapping.get("servers").getAsJsonArray() 开头,如果您可以访问Guava Streams,则可以执行以下单行:

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

注意StreamSupport 将无法在JsonElement 类型上工作,所以它是不够的。

【讨论】:

以上是关于使用 Gson 将 JSON 数组解析为 java.util.List的主要内容,如果未能解决你的问题,请参考以下文章

java怎么使用gson解析json字符串

使用 Gson 解析后将嵌套的 JSON 数组插入 SQLite

无法使用 Gson 将包含嵌套 json 数组的 json 转换为等效的 JAVA 类

Android JSON数据解析(GSON方式)

android使用gson解析嵌套复杂的json数据,数据怎么显示到布局上,布局怎么写

Java Gson 实现 Json 数据的生成与解析