使用 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 JSONObjectsJSONArray 并且该列表包含在父 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
}