使用 GSON 解析 Feed Android
Parsing Feed with GSON Android
我有一个 JSON 格式如下:-
{
students: [
{
name:"ABC",
deptt:"Physics",
year:"1st"
},
{
name:"XYZ",
deptt:"Mathematics",
year:"2nd"
}
]
}
我从使用 Volley 库调用的 Web 服务获得了此响应。我将此响应存储在一个字符串中。
现在要解析此提要,我正在尝试使用 GSON 库。我创建了一个名为 Students 的 class,如下所示:-
public class Students{
@SerializedName("name")
private String name;
@SerializedName("deptt")
private String deptt;
@SerializedName("year")
private String year;
public Students(String name,String deptt,String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
//followed by getters and setter for each member
}
编辑
完成对网络服务的调用后,我调用了另一个函数(如下所示来解析提要)
public void parseTheFeed(String data)
{
Log.d("Data",data);
Gson gSon = new Gson();
Students studentData = gSon.fromJson(data,Students.class); //data == feed from webservice
Log.d("StudentData-Title", studentData.getName());
}
请注意,我在 Volley 的 onResponse
中调用了方法 "parseTheFeed(String data)"。
但是我在使用 Log.d 语句时收到 NullPointerException 错误。报错信息为"println needs a message"
您的模型与您要表示的数据的结构不匹配。从您的示例数据来看,您的模型应该更像这样。然后 Gson
将正确处理您指定的数据。
public class School {
public List<Student> students;
public static class Student {
private String name;
private String deptt;
private String year;
public Student(String name,String deptt,String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
}
}
请注意,您的 student
字段实际上是 Student
JSONObjects
的 JSONArray
并且该列表包含在父 JSONObject
中
使用上面的方法,您可以轻松地将它从 json 解析为 java 对象
School school = new Gson().fromJson(data, School.class);
List<Student> students = school.students;
// do something with list of students
另请注意 @SerializedName
不存在。如果您想更改字段的名称,则使用此注释。例如,如果我们想将 School#students
字段命名为 School#scholors
,我们将使用它。使用您的数据和我的模型的示例 class
public class School {
@SerializedName("students")
public List<Student> scholors;
...
}
为 Student
包装 class 并不是绝对必要的。万一您的应用程序域模型没有学校实体开始,并且您不想仅仅为了 JSON 反序列化而添加它,您可以直接将学生解组为 List
.
// input is your web service response
JsonObject data = gson.fromJson(input, JsonObject.class);
// collect Students into a List
Type type = new TypeToken<List<Student>>() {}.getType();
List<Student> students = gson.fromJson(data.getAsJsonArray("students"), type);
// access a Student object
System.out.println(students.get(0).getName()); // ABC
这里Student
是同一个旧的POJO class (但命名为单数)
public class Student {
@SerializedName("name")
private String name;
@SerializedName("deptt")
private String deptt;
@SerializedName("year")
private String year;
public Student(String name, String deptt, String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
// followed by getters and setter for each member
}
我有一个 JSON 格式如下:-
{
students: [
{
name:"ABC",
deptt:"Physics",
year:"1st"
},
{
name:"XYZ",
deptt:"Mathematics",
year:"2nd"
}
]
}
我从使用 Volley 库调用的 Web 服务获得了此响应。我将此响应存储在一个字符串中。
现在要解析此提要,我正在尝试使用 GSON 库。我创建了一个名为 Students 的 class,如下所示:-
public class Students{
@SerializedName("name")
private String name;
@SerializedName("deptt")
private String deptt;
@SerializedName("year")
private String year;
public Students(String name,String deptt,String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
//followed by getters and setter for each member
}
编辑
完成对网络服务的调用后,我调用了另一个函数(如下所示来解析提要)
public void parseTheFeed(String data)
{
Log.d("Data",data);
Gson gSon = new Gson();
Students studentData = gSon.fromJson(data,Students.class); //data == feed from webservice
Log.d("StudentData-Title", studentData.getName());
}
请注意,我在 Volley 的 onResponse
中调用了方法 "parseTheFeed(String data)"。
但是我在使用 Log.d 语句时收到 NullPointerException 错误。报错信息为"println needs a message"
您的模型与您要表示的数据的结构不匹配。从您的示例数据来看,您的模型应该更像这样。然后 Gson
将正确处理您指定的数据。
public class School {
public List<Student> students;
public static class Student {
private String name;
private String deptt;
private String year;
public Student(String name,String deptt,String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
}
}
请注意,您的 student
字段实际上是 Student
JSONObjects
的 JSONArray
并且该列表包含在父 JSONObject
使用上面的方法,您可以轻松地将它从 json 解析为 java 对象
School school = new Gson().fromJson(data, School.class);
List<Student> students = school.students;
// do something with list of students
另请注意 @SerializedName
不存在。如果您想更改字段的名称,则使用此注释。例如,如果我们想将 School#students
字段命名为 School#scholors
,我们将使用它。使用您的数据和我的模型的示例 class
public class School {
@SerializedName("students")
public List<Student> scholors;
...
}
为 Student
包装 class 并不是绝对必要的。万一您的应用程序域模型没有学校实体开始,并且您不想仅仅为了 JSON 反序列化而添加它,您可以直接将学生解组为 List
.
// input is your web service response
JsonObject data = gson.fromJson(input, JsonObject.class);
// collect Students into a List
Type type = new TypeToken<List<Student>>() {}.getType();
List<Student> students = gson.fromJson(data.getAsJsonArray("students"), type);
// access a Student object
System.out.println(students.get(0).getName()); // ABC
这里Student
是同一个旧的POJO class (但命名为单数)
public class Student {
@SerializedName("name")
private String name;
@SerializedName("deptt")
private String deptt;
@SerializedName("year")
private String year;
public Student(String name, String deptt, String year)
{
this.name = name;
this.deptt = deptt;
this.year = year;
}
// followed by getters and setter for each member
}