【问题标题】:Parsing Feed with GSON Android使用 GSON Android 解析提要
【发布时间】:2015-10-17 20:38:24
【问题描述】:

我有一个 JSON 格式如下:-

{

    students: [
                    {
                        name:"ABC",
                        deptt:"Physics",
                        year:"1st"  
                    },
                    {
                        name:"XYZ",
                        deptt:"Mathematics",
                        year:"2nd"
                    }
            ]
}

我从使用 Volley 库调用的 Web 服务获得此响应。我将此响应存储在一个字符串中。

现在要解析这个提要,我正在尝试使用 GSON 库。我创建了一个名为 Student 的类,如下所示:-

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 需要一条消息”

【问题讨论】:

  • 显示您如何分配data。问题就在那里。
  • @leeor :- 编辑了问题。在 volley 的 onResponse 内部,我调用了另一个名为 parseTheFeed(String data) 的方法,并将 onResponse 的返回值(即结果)传递给 parseTheFeed(String data)
  • 您作为参数传递的data 似乎是null,告诉我们您如何调用parseTheFeed 方法
  • @dazito:- 我只是在parseTheFeed(String data) 中添加了一个日志语句来检查data...它不为空。
  • @JhilmilChatterjee 那么data 的值是多少?

标签: android json web-services gson android-volley


【解决方案1】:

您的模型与您要表示的数据结构不匹配。从您的示例数据中,您的模型应该更像这样。那么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 字段实际上是 JSONArrayStudent JSONObjects 并且该列表包含在父 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,我们将使用它。使用您的数据和我的模型类的示例

public class School {
    @SerializedName("students")
    public List<Student> scholors;
        ...
}

【讨论】:

  • 这行得通......所以基本上,我在为来自 web 服务的提要构建模式类时错了。谢谢。
【解决方案2】:

拥有Students 的包装类并不是绝对必要的。如果您的应用程序域模型开始时没有学校实体,并且您不想仅仅为了 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 类(但命名为单数)

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多