android - Retrofit Body 提供空值但在 Postman 中变得完美
问题描述
我正在尝试解析 JSON
{
"CALLBACK_URL": "http://159.65.00/api/paytm/response/",
"ORDER_ID": "yKaiv4",
"CUST_ID": "adhish@abc.com",
"TXN_AMOUNT": "1",
"CHECKSUMHASH": "j7WzwAh5SFzmP4JWKx9X3mpcv6VxCenaSiWzArjdQgnblpL9YLy4Hio8tHuB2O0ZOiQ1vewsxPKd52HG9rmxYQ=",
"WEBSITE": "WEB_STAGING",
"CHANNEL_ID": "WEB",
"INDUSTRY_TYPE_ID": "Retail",
"MID": "DIY123555501617"
}
上面的 JSON 我在 POSTMAN 中得到,但是当我尝试使用以下 POJO 类在我的 Android Java 代码中解析它时,我的 JSONbody 元素为空。POJO 类是:
import com.google.gson.annotations.SerializedName;
public class PaytmResponse {
@SerializedName("MID")
String mid;
@SerializedName("INDUSTRY_TYPE_ID")
String industryTypeId;
@SerializedName("CHANNEL_ID")
String channelId;
@SerializedName("ORDER_ID")
String orderId;
@SerializedName("CALLBACK_URL")
String callbackUrl;
@SerializedName("TXN_AMOUNT")
String txnAmount;
@SerializedName("CUST_ID")
String custId;
@SerializedName("CHECKSUMHASH")
String checksumHash;
@SerializedName("WEBSITE")
String webSite;
public String getMid() {
return mid;
}
public String getIndustryTypeId() {
return industryTypeId;
}
public String getChannelId() {
return channelId;
}
public String getOrderId() {
return orderId;
}
public String getCallbackUrl() {
return callbackUrl;
}
public String getTxnAmount() {
return txnAmount;
}
public String getCustId() {
return custId;
}
public String getChecksumHash() {
return checksumHash;
}
public String getWebSite() {
return webSite;
}
}
这就是我尝试在我的 Android 代码中使用函数的方式:
private void getChecksumFromServer(String movieName, String amount) {
RetrofitClient retrofitClient = new RetrofitClient(getActivity());
retrofitInterface = retrofitClient.getClient().create(RetrofitInterface.class);
Call<PaytmResponse> call = retrofitInterface.generateChecksumHash(movieName,amount,"application/json","Token "+sharedPreferencesHelper.getString(Constants.TOKEN,""));
call.enqueue(new Callback<PaytmResponse>() {
@Override
public void onResponse(Call<PaytmResponse> call, Response<PaytmResponse> response) {
Logger.d("CODE",response.code()+"");
Logger.d("MESSAGE",response.message()+"");
Logger.d("RESPONSE",""+new Gson().toJson(response));
Logger.d("URL",""+response.raw().request().url());
if (response.isSuccessful()) {
String MID = response.body().getMid();
String INDUSTRY_TYPE_ID = response.body().getIndustryTypeId();
String CHANNEL_ID = response.body().getChannelId();
String ORDER_ID = response.body().getOrderId();
String CALLBACK_URL = response.body().getCallbackUrl();
String TXN_AMOUNT = response.body().getTxnAmount();
String CUST_ID = response.body().getCustId();
String CHECKSUMHASH = response.body().getChecksumHash();
String WEBSITE = response.body().getWebSite();
processPayment(MID, INDUSTRY_TYPE_ID, CHANNEL_ID, ORDER_ID, CALLBACK_URL, TXN_AMOUNT, CUST_ID, CHECKSUMHASH, WEBSITE);
} else {
ToastHelper.showToast(getActivity(),response.message());
}
}
@Override
public void onFailure(Call<PaytmResponse> call, Throwable t) {
Logger.e(TAG, "FAILED : " + t.toString());
}
});
}
现在,我的 Java 代码中的以下值给出了空值:
String MID = response.body().getMid();
String INDUSTRY_TYPE_ID = response.body().getIndustryTypeId();
String CHANNEL_ID = response.body().getChannelId();
String ORDER_ID = response.body().getOrderId();
String CALLBACK_URL = response.body().getCallbackUrl();
String TXN_AMOUNT = response.body().getTxnAmount();
String CUST_ID = response.body().getCustId();
String CHECKSUMHASH = response.body().getChecksumHash();
String WEBSITE = response.body().getWebSite();
我在哪里犯错误?请注意,代码是 200 成功,它的正文如 POSTMAN 中的 JSON 响应所示。
解决方案
响应的.body()
只能读取一次。您应该将其存储在一个变量中并多次读取该变量。
更好的是:不要手动解析响应。相反,使用改造的 gson(或其他 json 库)解析器。
推荐阅读
- rust - 是否可以让 Future::and_then 有条件地返回不同的期货?
- c# - 基于 light.enabled 控制运动。C#
- selenium-webdriver - 无法找到元素,这是要删除 Salesforce 闪电中的对象
- web-scraping - 如何在 Scrapy 中提取所有请求标头?
- python - 创建 API 以执行 python 脚本
- powershell - 如何使用 Windows Powershell 从头开始遍历 .text 文件?
- javascript - 在 js.cytoscape 中限制鼠标滚动功能
- swift - 如何使用多个视图控制器使用 Firebase 身份验证?
- python - 应用 vs 嵌套 for 循环
- python - 无法将检查点模型转换为 Tensorflow 图原型