Retrofit преобразует массив объектов в GSON Error

Я использую Retrofit, чтобы сделать HTTP-запрос, который возвращает массив объекта, и я получаю следующие ошибки:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY 

Ожидается, что ответ будет таким:

 [ {key1: "value1", key2: "value2"}, {key1: "value1", key2: "value2"}, ... ] 

У меня есть следующий класс для сериализации данных:

 public class data { private List<element> dataList; public List<element> getElements() { return dataList; } public class element { @SerializedName("key1") private String key1; @SerializedName("key2") private String key2; // Getters and Setters } } 

Пожалуйста, дайте мне знать, если у вас есть идеи. благодаря

Solutions Collecting From Web of "Retrofit преобразует массив объектов в GSON Error"

Ошибка была в моей реализации Retrofit Callback. Моя реализация ожидала объект, когда в этом случае он должен ожидать массив. Спасибо всем за помощь.

До

 //*****MyData*****// public class MyData { private List<Data> dataList; public List<Data> getElements() { return dataList; } public class Data { @SerializedName("key1") private String key1; @SerializedName("key2") private String key2; // Getters and Setters } } //*****Callback Implementation*****// public class MyDataCallback extends Callback { public MyDataCallback(MyDataCallbackListener<MyData> myDataCallbackListener) { super(myDataCallbackListener); } @Override public void success(MyData data, Response response) { if (myDataCallbackListener != null) { myDataCallbackListener.onCallbackComplete(true, response, MyDataCallback.CALLBACK_SUCCESS_MESSAGE, data); } } } 

После

 //*****Data*****// public class Data { @SerializedName("key1") private String key1; @SerializedName("key2") private String key2; // Getters and Setters } //*****Callback Implementation*****// public class MyDataCallback extends Callback { public MyDataCallback(MyDataCallbackListener<List<Data>> myDataCallbackListener) { super(myDataCallbackListener); } @Override public void success(List<Data> data, Response response) { if (myDataCallbackListener != null) { myDataCallbackListener.onCallbackComplete(true, response, MyDataCallback.CALLBACK_SUCCESS_MESSAGE, data); } } } 

Как отметил Дэйв в своем комментарии, странно, что у вас есть рекурсия в классе, который я принимаю, это ваш объект ответа. (У ваших «данных» вашего класса есть список объектов «данных»).

Я бы предложил что-то еще более прямое, например:

 public class ResponseObject { private ArrayList<DataObject> mDataObjects; public ArrayList<DataObject> getDataObjects() { return mDataObjects; } private class DataObject { private String key1; private String key2; public String getKey1() { return key1; } public String getKey2() { return key2; } } } 

Или, поскольку вы местный, возможно, вы можете купить Джейка пиво 🙂 От его фотографии я бы проверил Rouge Ales, 21 Amendment или мой любимый в прошлый раз, когда я был в SF – Magnolia

Недействительно JSON, чтобы начать с массива. Вам нужно вместо этого вернуть что-то вроде этого:

 { dataList: [ { key1: "value1", key2: "value2" }, { key1: "value3", key2: "value4" } ] } 

Затем вы можете использовать GSON для десериализации этого класса data .