JSON响应的int值始终返回零

时间:2019-09-29 07:05:22

标签: android json retrofit2

我使用改造库调用HTTP请求,并从API获取结果。我在改型库中配置了日志,所以我可以看到发生了什么。响应是简单的原始整数类型。 问题是它总是返回零。响应类(LoginModel)也是经典类,对于整数类型,它具有一个setter和一个getter。

Log.i("BODY : ", String.valueOf(response.body().getResult()));

下面的图像是我的日志,您可以看到我收到响应10,但是当我在onResponse函数中记录 getResult 时,它始终打印为零。

Call<LoginModel> isSended = apiService.sendCode(phoneNumber);
            isSended.enqueue(new Callback<LoginModel>() {
                @Override
                public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
                    Log.i("BODY : ", String.valueOf(response.body().getResult()));
                    if (!response.isSuccessful()) {
                        Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();
                        dismissProgressBarDialog();
                        return;
                    }
                    myTimer = new MyTimer(SECOND_TIME, 1000);
                    views.reactionActivationPress(response.body().getResult());
                }

                @Override
                public void onFailure(Call<LoginModel> call, Throwable t) {
                    Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
                    dismissProgressBarDialog();
                    Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
                }
            });

enter image description here

我不知道怎么了。感谢您的帮助。谢谢

更新:调用API的完整代码

OkHttpClient client = new OkHttpClient.Builder()
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .readTimeout(30, TimeUnit.SECONDS)
                    .addInterceptor(loggingInterceptor)
                    .addInterceptor(chain -> {
                        Request request = chain.request();
                        Request newRequest;
                        newRequest = request.newBuilder()
                                .addHeader(HEADER_VERSION_CODE, String.valueOf(BuildConfig.VERSION_CODE))
                                .build();
                        return chain.proceed(newRequest);
                    })
                    .build();

            Gson gson = new GsonBuilder()
                    .setLenient()
                    .create();

            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(ScalarsConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();

Gson和改造创建代码:

astring = "apple"
bstring = "_ " * 5
print(bstring)
my_input = input("enter a letter")

for i, n in enumerate(astring):
    if my_input == i:
        bstring[n] = my_input
    else:
        i = i + 1

print(bstring)

6 个答案:

答案 0 :(得分:4)

代码没有问题。它运作良好。 确保您在翻新时使用了Gson。 我已经测试了代码并正常工作。无需在模型类中进行更改。

答案 1 :(得分:3)

您在代码中发出的问题是您尝试以响应方式访问结果两次,请尝试以下操作

仅声明一次response.body().getResult()

    Call<LoginModel> isSended = apiService.sendCode(phoneNumber);
                    isSended.enqueue(new Callback<LoginModel>() {
                        @Override
                        public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {

                        dismissProgressBarDialog();
                        int model = response.body().getResult();                   
                        Log.i("BODY : ", String.valueOf(model));
                            if (!response.isSuccessful()) {
                                Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();

                                return;
                            }
                            myTimer = new MyTimer(SECOND_TIME, 1000);
                            views.reactionActivationPress(model);
                        }

                        @Override
                        public void onFailure(Call<LoginModel> call, Throwable t) {
                            Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
                            dismissProgressBarDialog();
                            Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
                        }
                    });

答案 2 :(得分:3)

        ApiClient.getClient().create(ApiService.class).sendCode(phoneNumber).enqueue(new Callback<LoginModel>() {
            @Override
            public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
                Log.i("BODY : ", String.valueOf(response.body().getResult()));
                if (!response.isSuccessful()) {
                    Toast.makeText(context, context.getResources().getString(R.string.errorServer), Toast.LENGTH_LONG).show();
                    dismissProgressBarDialog();
                    return;
                }
                myTimer = new MyTimer(SECOND_TIME, 1000);
                views.reactionActivationPress(response.body().getResult());
            }

            @Override
            public void onFailure(Call<LoginModel> call, Throwable t) {
                Log.i(Constant.NETWORK_LOG, "sendCode : " + t.toString());
                dismissProgressBarDialog();
                Toast.makeText(MyApplication.getContext(), "Server Problem", Toast.LENGTH_LONG).show();
            }
        });

答案 3 :(得分:2)

尝试将“结果”字段设为公开而非私有。我猜想,这种改型将忽略您的json而不是完全初始化结果字段。删除getter和setter并将结果字段公开。

public class LoginModel {

  @SerializedName("result")
  public int result;

}

答案 4 :(得分:2)

使用Integer,如果您为空,则意味着您从服务器获得的json具有另一个名称或类型 用邮递员测试您的api 并检查响应名称并输入

public class LoginModel {

    @SerializedName("result")
    @Expose
    private Integer result;

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

    public Integer getResult(){
        return result;
    }
}

答案 5 :(得分:0)

我认为您的POJO类中存在问题。 尝试此操作可能会对您有所帮助

public class LoginModel implements Serializable {

    @SerializedName("result")
    @Expose
    private Integer result;

    public Integer getResult() {
        return result;
    }

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

}