2014-09-12 4 views
8

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

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 
    } 
} 

Pl легкость, дайте мне знать, если у вас есть идеи. Спасибо

+0

вы должны определить список рекурсивно? можете ли вы разобрать ваш json в JsonArray, а затем вытащить отдельные объекты данных? – Dave

ответ

10

Ошибка была в моей реализации 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); 
     } 
    } 
} 
+0

Спасибо, что ты дал мне подсказку. –

-3

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

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

Затем вы можете использовать GSON десериализации, что в вашем data класса.

+10

Это неправда. JSON отлично действует. –

+0

@JakeWharton прав, мой плохой. Я не видел проблему рекурсивной структуры данных, я думал, что это просто образование JSON. –

0

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

Я хотел бы предложить что-то немного более смирительные вперед, как эти:

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 Алесь, 21 Поправки или мой любимый последний раз, когда я был в SF - Magnolia

+0

Я опробовал ваше решение, но я все еще получаю тот же JSONSyntaxError. Мне не нужно иметь рекурсивный класс. Я разместил этот вопрос о получении ответа JSON до того, как Retrofit превратит его в GSON, может быть, посмотрите. http://stackoverflow.com/questions/25853071/retrofit-how-to-print-out-response-json –