Как использовать модификацию для получения списка объектов из API, которые возвращают объект Json, а не Json Array - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь использовать модификацию, чтобы получить данные из API, которые возвращают объект json, а не массив json, но вызов выдает сообщение об ошибке, печальное ожидание массива json, а не объекта json, могу ли я что-нибудь сделать , Могу ли я использовать другой способ получить данные из облака, кроме модернизации и установить body.value для viewModel Примечание: я пытался присвоить моему вызову имя для сериализации, но оно не работает

Код API

package com.city.coding.viewmodelwithretrofit;

import com.city.coding.viewmodelwithretrofit.model.Voucher;
import com.google.gson.annotations.SerializedName;

import org.json.JSONObject;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

public interface Api {

    public static final String BASE_VOUCHER_URL = "http://example.com/loycher/api/";
    public static final String BASE_SIGNUP_USER_URL ="http://example.com/loycher/api/";
    @SerializedName("list_of_voucher")
    @GET("voucher_list.php")
    Call<List<Voucher>> getVoucherList(@Query("user_id") int user_id);

Ваучер модель POJO

package com.city.coding.viewmodelwithretrofit.model;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Voucher {

    @SerializedName("voucher_id")
    @Expose
    private String voucherId;
    @SerializedName("voucher_name")
    @Expose
    private String voucherName;
    @SerializedName("voucher_qty")
    @Expose
    private String voucherQty;
    @SerializedName("voucher_value")
    @Expose
    private String voucherValue;
    @SerializedName("voucher_img")
    @Expose
    private String voucherImg;

    /**
     * No args constructor for use in serialization
     */
    public Voucher() {
    }

    /**
     * @param voucherValue
     * @param voucherName
     * @param voucherQty
     * @param voucherImg
     * @param voucherId
     */
    public Voucher(String voucherId, String voucherName, String voucherQty, String voucherValue, String voucherImg) {
        super();
        this.voucherId = voucherId;
        this.voucherName = voucherName;
        this.voucherQty = voucherQty;
        this.voucherValue = voucherValue;
        this.voucherImg = voucherImg;
    }

    public String getVoucherId() {
        return voucherId;
    }

    public void setVoucherId(String voucherId) {
        this.voucherId = voucherId;
    }

    public String getVoucherName() {
        return voucherName;
    }

    public void setVoucherName(String voucherName) {
        this.voucherName = voucherName;
    }

    public String getVoucherQty() {
        return voucherQty;
    }

    public void setVoucherQty(String voucherQty) {
        this.voucherQty = voucherQty;
    }

    public String getVoucherValue() {
        return voucherValue;
    }

    public void setVoucherValue(String voucherValue) {
        this.voucherValue = voucherValue;
    }

    public String getVoucherImg() {
        return voucherImg;
    }

    public void setVoucherImg(String voucherImg) {
        this.voucherImg = voucherImg;
    }

}

MyViewModel class

package com.city.coding.viewmodelwithretrofit;

import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.MutableLiveData;
import android.arch.lifecycle.ViewModel;
import android.support.annotation.NonNull;
import android.util.Log;

import com.city.coding.viewmodelwithretrofit.model.Voucher;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class voucherViewModel extends ViewModel {
    private String TAG = "voucherViewModel";
    private MutableLiveData<List<Voucher>> voucherMutableList;


    public LiveData<List<Voucher>> getVoucher(int user_id) {
        if (voucherMutableList == null) {
            voucherMutableList = new MutableLiveData<>();
            loadVoucher(user_id);
        }

        return voucherMutableList;
    }

    private void loadVoucher(int user_id) {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Api.BASE_VOUCHER_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        Api api = retrofit.create(Api.class);
        Call<List<Voucher>> call = api.getVoucherList(user_id);


        call.enqueue(new Callback<List<Voucher>>() {
            @Override
            public void onResponse(Call<List<Voucher>> call, Response<List<Voucher>> response) {
                Log.e(TAG, "onResponse: " + call.request().url());
                Log.e(TAG, "onResponse: " + response.toString());
                voucherMutableList.setValue(response.body());
            }

            @Override
            public void onFailure(Call<List<Voucher>> call, Throwable t) {
                Log.e(TAG, "onResponse: " + call.request().url());
                Log.e(TAG, "onFailure: " + t.getCause());
                Log.e(TAG, "onFailure: " + t.getLocalizedMessage());
                Log.e(TAG, "onFailure: " + t.getMessage());
                Log.e(TAG, "onFailure: " + t.toString());

            }
        });
    }

}

Сообщение Logcat

    01-14 14:51:09.189 12189-12189/? E/voucherViewModel: onFailure: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
01-14 14:51:09.189 12189-12189/? E/voucherViewModel: onFailure: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
01-14 14:51:09.189 12189-12189/? E/voucherViewModel: onFailure: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
...