Retrofit将对象数组转换为GSON Error

时间:2014-09-12 22:09:56

标签: java android json gson retrofit

我正在使用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
  }
}

如果您有任何想法,请告诉我。感谢

3 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分:0)

正如Dave在他的评论中提到的那样,你在类中的递归似乎很奇怪,我假设它是你的响应对象。 (你的班级&#34;数据&#34;有一个&#34;数据&#34;对象的列表。)

我会建议一些像这样的更紧张的前进:

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

答案 2 :(得分:-3)

以数组开头是无效的JSON。你需要返回这样的东西:

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

然后,您可以使用GSON将其反序列化为data类。