【问题标题】:Handle JSON responce in retrofit 2.0在改造 2.0 中处理 JSON 响应
【发布时间】:2017-12-26 06:23:57
【问题描述】:

我知道这是老问题或重复问题。但我没有明白我错在哪里。 我从这个 JSON 得到了 null 的结果。

{
"error": {
    "dateTimeUtc": "2017-12-26T05:46:05.1126801+00:00",
    "errorReference": "sample string 2",
    "errorType": "Error",
    "title": "sample string 3",
    "code": "sample string 4",
    "messages": [
      "sample string 1",
      "sample string 2"
    ]
  },
  "result": {
    "message": "sample string 1"
  }
}

我有这种类型的 JSON 可以从 Retrofit2 中读取。 我创建了一个名为 RetrofitResponce

的 POJO 类
private Error error;
private Result result;
public Result getResult ()
{
    return result;
}

public void setResult (Result result)
{
    this.result = result;
}

public Error getError ()
{
    return error;
}

public void setError (Error error)
{
    this.error = error;
}

@Override
public String toString()
{
    return "ClassPojo [result = "+result+", error = "+error+"]";
}`

现在在 call.enque() 方法中处理响应,比如

call.enqueue(new Callback<RegisterUser>() {
        @Override
        public void onResponse(Call<RetrofitResponce> call, Response<RetrofitResponce> response) {

            try {
                RetrofitResponce retrofitResponce= response.body();

                Error error = retrofitResponce.getError();
                Result result=retrofitResponce.getResult();


                Log.e("Eroor", "rr  " + error.getTitle().toString());
            } catch (Exception e) {

            }
        }

        @Override
        public void onFailure(Call<RetrofitResponce> call, Throwable t) {
            Log.e("Failure ", "fail " + t.toString());
        }
    });

但在这里我得到 NullPointerException,即我在 RestrofitResponce 中没有得到任何回应。 Error 和 Result 都为 Null。

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“net.xyz.abc.Model.Error net.xyz.abc.Model.RegisterUser.getError()”

请帮助我。尝试解决我的问题。提前致谢。

邮递员回应,

{
"error": {
    "dateTimeUtc": "2017-12-26T07:05:51.1427712Z",
    "errorReference": "00000000-0000-0000-0000-000000000000",
    "errorType": "Error",
    "title": "The request is invalid.",
    "code": null,
    "messages": [
        "Passwords must have at least one non letter or digit character. Passwords must have at least one uppercase ('A'-'Z')."
    ]
},
"result": null

}

【问题讨论】:

  • @Rohit,这是成功和失败响应还是成功响应与此不同?
  • 我在 PostMan 软件上测试了相同的 URL。我在那里取得了成功。
  • 请同时发布成功响应和失败响应。
  • 你得到了 null 因为可能是你的成功响应和失败响应都不同。

标签: android json retrofit2 pojo


【解决方案1】:

改造回调需要响应模型,改一下:

call.enqueue(new Callback<RetrofitResponce>() {
        @Override
        public void onResponse(Call<RetrofitResponce> call, Response<RetrofitResponce> response) {


                if (response.isSuccessful()) {
                RetrofitResponce retrofitResponce= response.body();
                if (retrofitResponce!=null) {   
                Error error = retrofitResponce.getError();
                Result result=retrofitResponce.getResult();       
                Log.e("Eroor", "rr  " + error.getTitle().toString());
              }
            }                
        }

        @Override
        public void onFailure(Call<RetrofitResponce> call, Throwable t) {
            Log.e("Failure ", "fail " + t.toString());
        }
    });

编码愉快!!

【讨论】:

    【解决方案2】:

    您必须在响应类中为每个与 Web 服务名称相同的文件添加 @SerializedName。

    例如

    @SerializedName("error")
    private Error error;
    @SerializedName("result")
    private Result result;
    

    请使用此网站从 JSON 响应创建您的类。 http://www.jsonschema2pojo.org/

    然后你必须检查响应是否成功。

    call.enqueue(new Callback<RegisterUser>() {
            @Override
            public void onResponse(Call<RetrofitResponce> call, Response<RetrofitResponce> response) {
    
                try 
                {
                    if(response.isSuccessful() && response.body() != null)
                    {
                        RetrofitResponce retrofitResponce= response.body();
                        Error error = retrofitResponce.getError();
                        Result result=retrofitResponce.getResult();
                     }
    
                } catch (Exception e) {
    
                }
            }
    
            @Override
            public void onFailure(Call<RetrofitResponce> call, Throwable t) {
                Log.e("Failure ", "fail " + t.toString());
            }
        });
    

    【讨论】:

      【解决方案3】:

      试试这个 Pojo for RetrofitResponce

      public class RetrofitResponce {
      
      @SerializedName("error")
      @Expose
      private Error error;
      @SerializedName("result")
      @Expose
      private Result result;
      
      public Error getError() {
      return error;
      }
      
      public void setError(Error error) {
      this.error = error;
      }
      
      public Result getResult() {
      return result;
      }
      
      public void setResult(Result result) {
      this.result = result;
      }
      
      }
      
      
      public class Result {
      
      @SerializedName("message")
      @Expose
      private String message;
      
      public String getMessage() {
      return message;
      }
      
      public void setMessage(String message) {
      this.message = message;
      }
      
      }
      
      
      public class Error {
      
      @SerializedName("dateTimeUtc")
      @Expose
      private String dateTimeUtc;
      @SerializedName("errorReference")
      @Expose
      private String errorReference;
      @SerializedName("errorType")
      @Expose
      private String errorType;
      @SerializedName("title")
      @Expose
      private String title;
      @SerializedName("code")
      @Expose
      private String code;
      @SerializedName("messages")
      @Expose
      private List<String> messages = null;
      
      public String getDateTimeUtc() {
      return dateTimeUtc;
      }
      
      public void setDateTimeUtc(String dateTimeUtc) {
      this.dateTimeUtc = dateTimeUtc;
      }
      
      public String getErrorReference() {
      return errorReference;
      }
      
      public void setErrorReference(String errorReference) {
      this.errorReference = errorReference;
      }
      
      public String getErrorType() {
      return errorType;
      }
      
      public void setErrorType(String errorType) {
      this.errorType = errorType;
      }
      
      public String getTitle() {
      return title;
      }
      
      public void setTitle(String title) {
      this.title = title;
      }
      
      public String getCode() {
      return code;
      }
      
      public void setCode(String code) {
      this.code = code;
      }
      
      public List<String> getMessages() {
      return messages;
      }
      
      public void setMessages(List<String> messages) {
      this.messages = messages;
      }
      
      }
      

      【讨论】:

        【解决方案4】:

        试试这个。

            call.enqueue(new Callback<RetrofitResponce>() {
            @Override
            public void onResponse(Call<RetrofitResponce> call, Response<RetrofitResponce> response) {
        
                if (response.body() != null)
        
               Toast.makeText(YourActivity.this,response.body().getResult(), 
               Toast.LENGTH_SHORT).show();
        
            }
        
            @Override
            public void onFailure(Call<RetrofitResponce> call, Throwable t) {
                Log.e("Failure ", "fail " + t.toString());
            }
        });
        

        【讨论】:

          【解决方案5】:

          我相信这会对您有所帮助。

          您无法通过单一模型处理成功和失败。 要获取错误正文,您需要调用 response.errorBody().string()

          试试下面的代码:

          call.enqueue(new Callback<RegisterUser>() {
              @Override
              public void onResponse(Call<RetrofitResponce> call, Response<RetrofitResponce> response) {
          
                 try {
                          if (response.isSuccessful()) {
                          Log.d("Successful",response.body();); 
                          } else {
                              Log.d("errorBody ", response.errorBody().string());
                          }
                      } catch (Exception e) {
                          Log.d("Exception ",e.toString());
                      }
          
              }
          
              @Override
              public void onFailure(Call<RetrofitResponce> call, Throwable t) {
                  Log.e("Failure ", "fail " + t.toString());
              }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-02
            • 2020-06-17
            • 2018-07-07
            • 2020-09-15
            • 2014-04-18
            • 1970-01-01
            相关资源
            最近更新 更多