Модифицированный корпус дает нулевые значения, но идеально подходит для почтальона - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь разобрать 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, но когда я пытаюсь проанализировать то же самое в своем коде Java Java с помощью следующего класса POJO, мои элементы 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 и имеет тело, как показано в ответе JSON в POSTMAN.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Как сказал @Tim Castelijns, .body() можно прочитать только один раз. Вы должны сделать что-то вроде этого

PaytmResponse response = response.body();
processPayment(response.getMid(), paymentResponse.getIndustryTypeId(), paymentResponse.getChannelId(), paymentResponse.getOrderId(), paymentResponse.getCallbackUrl(), paymentResponse.getTxnAmount(), paymentResponse.getCustId(), paymentResponse.getChecksumHash(), paymentResponse.getWebSite());
0 голосов
/ 03 июля 2018

Так что было что-то еще, и я понял это, когда попробовал тот же запрос с Волей. Залп показал мне фактический ответ JSON с правильными ключами, и эти ключи отсутствовали в моем классе POJO, поэтому значения здесь были NULL.

0 голосов
/ 02 июля 2018

Ответ .body() может быть прочитан только один раз. Вы должны сохранить его в переменной и прочитать ее несколько раз.

Еще лучше: не анализируйте ответ вручную. Вместо этого используйте модификатор gson (или другую библиотеку json).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...