2015-10-17 99 views
0

我有以下形式的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

回答

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場實際上是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建設飼料的模態類。謝謝。 –

0

,其中包裝膜類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 
}