2017-03-07 72 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; 
}