当前位置: 首页 > 知识库问答 >
问题:

在java中使用Gson解析JSON数组/对象

苏边浩
2023-03-14
{
"parcel":[
    {
        "firstName": "ABC",
        "lastName": "LAST",
        "email": "abc.LAST@g.com",
        "country": "United States",
        "dates": [
            "2013-05-01",
            "2014-05-07"
        ]
    },
    {
        "firstName": "CVS",
        "lastName": "Bad",
        "email": "cvs.Bad@g.com",
        "country": "Iceland",
        "dates": [
            "2010-04-30",
            "2011-01-01",

        ]
    }
    ]

}

我在公共类中的主要方法是这样的:

    public static void main(String[] args) throws IOException {
       try(Reader reader = new InputStreamReader(JsonToJava.class.getResourceAsStream("input.json"), "UTF-8")){
        Gson gson = new GsonBuilder().create();
        Parcel p = gson.fromJson(reader, Parcel.class);
        System.out.println(p);
       }
}

以下是包裹的代码

public class Parcel {

Data data;

@Override
public String toString() {
    return "Parcel [data=" + data + "]";
}

public Data getData() {
    return data;
}

public void setData(Data data) {
    this.data = data;
}
}
class Data{
public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getCountry() {
    return country;
}

public void setCountry(String country) {
    this.country = country;
}

public Arrays[] getAvailableDates() {
    return dates;
}

public void setAvailableDates(Arrays[] dates) {
    this.dates = dates;
}

@Override
public String toString() {
    return "Data [firstName=" + firstName + ", lastName=" + lastName + ", email=" + email + ", country=" + country
            + ", dates=" + Arrays.toString(dates) + "]";
}

private String firstName;

private String lastName;

private String email;

private String country;

private Arrays[] dates;

}

但是我似乎没有找到正确的方法来将变量的所有值存储在列表中。现在我得到的只是parcel[data=null]。

共有1个答案

慕河
2023-03-14

JSON输入和您的类层次结构必须兼容。现在您有了一个类parcel,其中有一个data属性,名为“data”。同时,JSON是一个具有名为“class”属性的对象。因此,gson在Parcel类中没有找到“class”属性,并且忽略了“data”属性get。

其次,您的JSON有一个数据数组,而不仅仅是一个数据实例,所以您必须用它来创建一个数组。

所以这应该更有效:

import com.google.gson.annotations.SerializedName;

public class Parcel {
    @SerializedName("class")
    Data[] data;

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();

        result.append("Parcel [data=");

        for(Data singleData : data) {
            if (singleData != data[0]) {
                result.append(", ");
            }

            result.append(singleData.toString());
        }

        result.append("]");

        return result.toString();
    }
}

这仍然可能崩溃,因为您省略了在data类中使用的“数组”类。如果将类型从arrays更改为string,它应该可以工作。

另外,我使用@serializedname注释将data属性映射到class属性,因为class在Java中是一个关键字。

跳过根元素(“parcel”)的解决方案:

try(Reader reader = new InputStreamReader(new ByteArrayInputStream(jsonString1.getBytes()), "UTF-8")){
    Gson gson = new GsonBuilder().create();

    JsonElement rootElement = gson.fromJson(reader, JsonObject.class).get("parcel");
    Data[] parcels = gson.fromJson(rootElement, Data[].class);
    for (Data parcel : parcels) {
        System.out.println(parcel);
    }
}
 类似资料:
  • 问题内容: 我有一个JSON,它可以是单个对象或相同对象的数组。有没有一种方法可以使用Gson解析此数据,从而区分单个对象还是数组? 我目前唯一的解决方案是手动解析json并用try catch包围它。首先,我将尝试将其解析为单个对象,如果失败,它将引发异常,然后尝试将其解析为数组。 我不想手动解析它……那将使我永远。这是正在发生的事情的想法。 这是可以是数组或单个对象的对象。 然后在与json响

  • 问题内容: 我有一个像这样的JSON文件: 在文件具有根元素之前,我将使用: 代码,但我不认为如何将类编码为根元素是一个数组。 我试过使用: 与: 但是还没有运气。使用这种方法我还能怎么读呢? PS我有这个工作使用: 但是我更想知道如何使用这两种方法(如果可能)。 问题答案: 问题是由放置在数组中的JSON对象(在 每种 情况下)的末尾逗号引起的: 如果删除它们,您的数据将成为 和 应该工作正常。

  • 附言:我用这个来工作: 但我更希望知道如何做到这一点(如果可能的话)与这两种方法。

  • 问题内容: 我想解析JSON数组并使用gson。首先,我可以记录JSON输出,服务器清楚地响应客户端。 这是我的JSON输出: 我尝试了这种结构进行解析。一个类,该类取决于单个和所有JSONArray。 上课时间: 当我尝试使用gson时,没有错误,没有警告,也没有日志: 怎么了,我该怎么解决? 问题答案: 你可以直接解析直接类,不需要再花更多时间包装你的Post类,也不需要新的类: 希望能有所帮

  • 问题内容: 我在解析从javascript获取的JSON时遇到问题。JSON的格式是这样的: 到目前为止,我已经能够做到这一点: 但是我现在还需要用这些位置创建一个类。我一直在上课,因为我先尝试打印输出,但是我无法进一步细分它。我收到此错误消息: java.lang.IllegalStateException:这不是JSON数组。 我的代码是这样的: 我也尝试过这种方式: 在这种情况下,我得到:

  • 服务器JSON数据显示在活动中使用改造。JSON数据通过gson转换。 给错误:"java.lang.IllegalState异常:预期BEGIN_ARRAY但BEGIN_OBJECT在第1行第2列路径$" JSON格式: 代码: 主要活动。kt