gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:11:07 25 4
gpt4 key购买 nike

我想使用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)类中的主要方法如下:

    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 输入和您的类层次结构必须兼容。现在您有了一个 Parcel 类,其中包含一个名为“data”的 Data 属性。同时,您的 JSON 是一个具有名为“class”属性的对象。因此 gson 在 Parcel 类中找不到“class”属性,并且“data”属性被忽略。

其次,您的 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”类。如果将类型从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);
}
}

关于java - 在java中使用Gson解析JSON数组/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com