【问题标题】:parse JSON array/object using Gson in java在 java 中使用 Gson 解析 JSON 数组/对象
【发布时间】:2018-04-29 16:16:31
【问题描述】:

我想用GSON在JAVA中解析一个JSON文件,文件格式如下:

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

以下是Parcel的代码:

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]。

【问题讨论】:

  • 确保您的 json 有效。好像无效。
  • 我无法质疑 JSON 格式。尽管如此,有没有办法直接跳转到键并解析出其他垃圾?

标签: java json parsing gson


【解决方案1】:

那么 JSON 输入和您的类层次结构必须兼容。现在你有一个类Parcel 和一个名为“data”的Data 属性。同时,您的 JSON 是一个具有名为“类”的属性的对象。所以 gson 在 Parcel 类中没有找到“类”属性,并且“数据”属性被忽略了。

其次,您的 JSON 有一个 Data 数组,而不仅仅是一个 Data 实例,因此您必须从中创建一个数组。

所以这应该会更好:

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 中的关键字。


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

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

【讨论】:

  • 感谢@vstm 我将课程固定为“包裹”。我尝试了您的建议,抱歉在这里有点困惑。因此想知道,如果我可以摆脱两个 java 类 - > Parcel 和 data 而只有一个。我本质上只想捕获姓名、电子邮件、国家和日期并着手处理。我想知道是否有办法只解析 JSON 文件中的前几个字符并处理 {}、{} 等中的内容。
  • @Niras:是的,这是可能的,您必须浏览 json 文档并获取包含包裹的数组,然后您可以读取数组中的元素。我在答案的末尾添加了一个编辑,以展示您如何做到这一点。
  • 谢谢你,我终于可以正常工作了。我需要在此处添加,我使用此链接 - pojo.sodhanalibrary.com 来创建无错误的 Java 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多