Java 改装将对象数组转换为GSON错误

Java 改装将对象数组转换为GSON错误,java,android,json,gson,retrofit,Java,Android,Json,Gson,Retrofit,我正在使用改型来发出HTTP请求,该请求返回一个对象数组,我得到以下错误: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY 返回的响应应如下所示: [ {key1: "value1", key2: "value2"}, {key1: "value1", key2: "value2"}, ... ] { data

我正在使用改型来发出HTTP请求,该请求返回一个对象数组,我得到以下错误:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY
返回的响应应如下所示:

[ {key1: "value1", key2: "value2"}, {key1: "value1", key2: "value2"}, ... ]
{
    dataList: [
        {
            key1: "value1",
            key2: "value2"
        },
        {
            key1: "value3",
            key2: "value4"
        }
    ]
}
我有以下类,用于序列化数据:

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
  }
}
公共类数据{
私有列表数据列表;
公共列表getElements(){
返回数据列表;
}
公共类元素{
@序列化名称(“键1”)
私有字符串键1;
@序列化名称(“键2”)
私有字符串键2;
//接球手和接球手
}
}

如果你有任何想法,请告诉我。谢谢,以数组开头不是有效的JSON。您需要返回如下内容:

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

然后您可以使用GSON将其反序列化到您的
数据
类中。

正如Dave在他的评论中提到的,在我假设为响应对象的类中有递归似乎很奇怪。(类“data”有一个“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;
    }

  }

}
公共类响应对象{
私有ArrayList mDataObjects;
公共ArrayList getDataObjects(){
返回mDataObjects;
}
私有类数据对象{
私有字符串键1;
私有字符串键2;
公共字符串getKey1(){
返回键1;
}
公共字符串getKey2(){
返回键2;
}
}
}

或者,既然你是本地人,也许你可以给杰克买一杯啤酒:)从他的照片上,我会查看胭脂酒、21修正案或我上次在SF-Magnolia时最喜欢的酒。

错误实际上是在我执行改装回调时发生的。我的实现需要一个对象,而在本例中它应该需要一个数组。谢谢大家的帮助

之前

//*****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);
        }
    }
}
/****MyData*****//
公共类MyData{
私有列表数据列表;
公共列表getElements(){
返回数据列表;
}
公共类数据{
@序列化名称(“键1”)
私有字符串键1;
@序列化名称(“键2”)
私有字符串键2;
//接球手和接球手
}
}
//*****回调实现*****//
公共类MyDataCallback扩展了回调{
公共MyDataCallback(MyDataCallbackListener MyDataCallbackListener){
超级(myDataCallbackListener);
}
@凌驾
public void成功(MyData数据、响应){
if(myDataCallbackListener!=null){
myDataCallbackListener.onCallbackComplete(true,response,MyDataCallback.CALLBACK\u SUCCESS\u消息,数据);
}
}
}
之后

//*****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”)
私有字符串键1;
@序列化名称(“键2”)
私有字符串键2;
//接球手和接球手
}
//*****回调实现*****//
公共类MyDataCallback扩展了回调{
公共MyDataCallback(MyDataCallbackListener MyDataCallbackListener){
超级(myDataCallbackListener);
}
@凌驾
public void成功(列表数据、响应){
if(myDataCallbackListener!=null){
myDataCallbackListener.onCallbackComplete(true,response,MyDataCallback.CALLBACK\u SUCCESS\u消息,数据);
}
}
}

是否必须递归定义列表?您能将json解析为JsonArray,然后取出单个数据对象吗?这不是真的。JSON完全有效。@JakeWharton是对的,我的错。我没有看到递归数据结构的问题,我以为这只是JSON的形成。我尝试了你的解决方案,但仍然得到了相同的JSONSyntaxError。我不需要递归类。我发布了一个问题,关于在将JSON改造为GSON之前获得JSON响应,请大家看一看。谢谢你给了我一个提示。