【问题标题】:How to parse nested JSON using GSON如何使用 GSON 解析嵌套的 JSON
【发布时间】:2017-03-07 15:42:56
【问题描述】:

我目前正在使用 volley 发出获取请求,并且在 onResponse 中我正在尝试使用 gson 将 jsonObject 解析为我的模型。

请求后返回的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 获取数据时,我可以获得成功和消息,例如获取电子邮件。该应用程序崩溃,我收到以下错误消息。

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

提前感谢所有帮助。

【问题讨论】:

  • JSONObject response 然后gson.fromJson(response.toString()... 解析 json 两次......真是浪费资源
  • 感谢您的评论,首先我是学习者并且错误地学习所以我接受您的并将我的代码变得更好,其次留下的评论可以留下帮助精神而不是批评者,如果离开作为评论家,请按照您的方式留下答案,这样至少其他人可以学习。 @塞尔文
  • 试试@SerializedName("data") @Expose private ClientData clientData; 否则你将不得不为每个字段使用注释
  • 嗨@PavneetSingh 感谢您的评论,如前所述,我只是在学习。就我的知识而言,您能否解释一下我如何实现它。我将在哪里实施 Expose private ClientData clientData;?我是否正确地说 SerializeName("data") 超出了私有 ClientData 客户端数据;并且 Expose 语句会在 ClientData 类之上?
  • \n 表示输入 @SerializedName("data") \n@Expose\n private ClientData clientData; ,我不确定它是否会起作用

标签: android json gson android-volley


【解决方案1】:

你的代码有一个小错误,所以你应该把ClientData clientData改成ClientData数据。然后你就可以得到数据了。希望这对你解析有帮助。

【讨论】:

    【解决方案2】:

    我有一个非常简单的方法给你:

    首先创建主模型: 另一个用于“数据”

    public class FeedBackModel {
        int success;
        String message;
        DataModel data;
    
    }
    
    public class DataModel {
    
        String company;
        String email;
        //etc ...
    }
    

    //为变量创建getter&setter

    然后当你得到 json 时,像这样解析它:

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

    【讨论】:

      【解决方案3】:

      如 user1912026 所述,更改如下。

      private ClientData data;
      

      如下改变setter和getter

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

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        相关资源
        最近更新 更多