解析饲料与GSON的Android

问题描述:

我有以下形式的JSON: -解析饲料与GSON的Android

{ 

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

我从一个web服务,我称之为使用凌空库此响应。我将这个响应存储在一个字符串中。

现在要解析这个提要,我正在尝试使用GSON库。我创建了一个类叫学生如下: -

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 
} 

编辑

后我到Web服务调用完成我调用另一个函数(如下解析饲料)

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)”方法。

但是我收到NullPointerException错误,同时使用Log.d语句。错误消息是“println需要消息”

+0

告诉你如何分配'data'。问题就在那里。 – leeor

+0

@爱好者: - 编辑了这个问题。在volley内部的onResponse中,我调用另一个名为'parseTheFeed(String data)'的方法,并传递'onResponse'(即。e结果)到'parseTheFeed(String data)' –

+0

好像你作为参数传递的'data'是'null',告诉我们你如何调用'parseTheFeed'方法 – dazito

您的模型与您想要表示的数据结构不匹配。从您的示例数据中,您的模型应该更像这样。然后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场实际上是StudentJSONObjects一个JSONArray和名单载于父JSONObject

使用上面你可以解析成由JSON容易

School school = new Gson().fromJson(data, School.class); 
List<Student> students = school.students; 
// do something with list of students 
一个Java对象

另请注意@SerializedName缺席。如果要更改字段的名称,则使用此注释。例如,如果我们想将School#students字段命名为School#scholors,我们会使用它。使用您的数据和我的模型类

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

这工作...所以基本上,我是错误的,同时从webservice建设饲料的模态类。谢谢。 –

,其中包装膜类Student榜样不是绝对必要的。如果您的应用程序域模型没有开始的学校实体,并且您不希望为了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 
}