2017-03-07 77 views
0

我目前正在使用抽球,並在onResponse使用get請求,我想解析使用gson jsonObject到我的模型。如何使用GSON解析嵌套的JSON

JSON後返回的請求時:

{ 
    "success": 1, 
    "message": "Done", 
    "data": { 
      "company": "companyname", 
      "email": "email", 
      "color": "#ffffff", 
      "text_color": "#000000", 
      "background_image": "BITMAP ENCODED", 
      "logo": "BITMAP ENCODED", 
      "enable_health_and_safety": 0, 
      "health_and_safety": "", 
      "sign_in_button_text": "SIGN IN", 
      "sign_out_button_text": "SIGN OUT", 
      "enable_picture": 0, 
      "package_type": "TRIAL", 
      "created_at": "2017-03-06 12:21:23", 
      "updated_at": "2017-03-06 12:21:23", 
      "telephone": "", 
      "auto_sign_out": 0, 
      "sign_out_time": "", 
      "enable_printing": 0 
      } 
} 

我的模型

public class ClientResponseModel implements Serializable { 
private String success; 
private String message; 
private ClientData clientData; 

public String getSuccess() { 
    return success; 
} 

public void setSuccess(String success) { 
    this.success = success; 
} 

public String getMessage() { 
    return message; 
} 

public void setMessage(String message) { 
    this.message = message; 
} 

public ClientData getClientData() { 
    return clientData; 
} 

public void setClientData(ClientData clientData) { 
    this.clientData = clientData; 
} 

public class ClientData implements Serializable { 
    private String company; 
    private String email; 
    private String client_color; 
    private String text_color; 
    private String background_image; 
    private String logo; 
    private int enable_health_and_safety; 
    private String health_and_safety; 
    private String sign_in_button_text; 
    private String sign_out_button_text; 
    private int enable_picture; 
    private String package_type; 
    private String created_at; 
    private String updated_at; 
    private String telephone; 
    private int auto_sign_out; 
    private String sign_out_time; 
    private int enable_printing; 

    //all the getters and setters for above 
} 

我onResponse功能

final JsonObjectRequest getClientData = new JsonObjectRequest(Request.Method.GET, clientUrl, null, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      Log.i("getUserDataOnResponse", response.toString()); 
      Gson gson = new Gson(); 
      ClientResponseModel clientResponseModel = gson.fromJson(response.toString(), ClientResponseModel.class); 


      Log.i("sucess",clientResponseModel.getSuccess()); 
      Log.i("message",clientResponseModel.getMessage()); 
      Log.i("company",clientResponseModel.getClientData().getEmail()); 

     } 

試圖讓我能獲得成功和郵件,但是郵件來自clientData的數據,Forexample獲取電子郵件。該應用程序崩潰,我收到以下錯誤消息。

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String ClientResponseModel$ClientData.getEmail()' on a null object reference 

我不知道我可能是做錯了,我已經看了幾個環節例如How to use gson and volley parse nested json

感謝提前所有幫助。

+0

'的JSONObject然後response'吸氣劑'gson.fromJson(response.toString()...'解析JSON兩次...什麼浪費資源 – Selvin

+0

感謝您的評論,首先我是學習者,並且錯誤地學習,所以我把你的,並會使我的代碼更好,其次,留下的評論可以留給幫助精神而不是批評者,如果作爲批評者離開,請留下一個答案因爲你會這樣做,所以至少其他人可以學習。@Selvin – chirag90

+0

嘗試'@SerializedName(「data」) @Expose隱私te ClientData clientData;'否則你將不得不爲每個字段使用註釋 –

回答

1

您的代碼存在一個小錯誤。因此,您應該將ClientData clientData更改爲ClientData數據。然後你可以得到數據。希望這將有助於你解析。

+0

非常感謝。這種方法按要求工作 – chirag90

0

我有一個非常簡單的方法爲您提供:

首先是建立主要型號: ,另一種爲「數據」

public class FeedBackModel { 
    int success; 
    String message; 
    DataModel data; 

} 

public class DataModel { 

    String company; 
    String email; 
    //etc ... 
} 

//創建的getter &二傳手變量

然後當你有JSON,分析它是這樣的:

  Gson gson = new Gson(); 
      Type CollectionType = new TypeToken<FeedBackModel>() { 
      }.getType(); 
      FeedBackModel FeedBack = gson.fromJson(json, CollectionType); 
+0

Hi @Hamid仍然會出現同樣的錯誤。 – chirag90

0

正如user1912026提到的,更改如下。

private ClientData data; 

,並更改setter和下面

public ClientData getClientData() { 
    return data; 
} 

public void setClientData(ClientData clientData) { 
    this.data = clientData; 
}