【问题标题】:Retrofit convert array of objects to GSON Error改造将对象数组转换为 GSON 错误
【发布时间】:2014-11-07 04:23:08
【问题描述】:

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

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

【问题讨论】:

  • 你必须递归定义列表吗?你能把你的 json 解析成一个 JsonArray,然后拉出单独的数据对象吗?

标签: java android json gson retrofit


【解决方案1】:

错误实际上是在我的 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);
        }
    }
}

【讨论】:

  • 谢谢你给我提示。
【解决方案2】:

正如 Dave 在他的评论中提到的,你在我假设是你的响应对象的类中有递归似乎很奇怪。 (您的“数据”类有一个“数据”对象列表)。

我会建议一些更严格的东西,例如:

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

  }

}

或者既然你是本地人,也许你可以给 Jake 买杯啤酒 :) 从他的照片中,我会检查 Rouge Ales、21 Amendment 或我上次在 SF - Magnolia 时最喜欢的

【讨论】:

  • 我尝试了您的解决方案,但仍然收到相同的 JSONSyntaxError。我不需要递归类。我发布了这个关于在 Retrofit 将其转换为 GSON 之前获取 JSON 响应的问题,请大家看看。 stackoverflow.com/questions/25853071/…
【解决方案3】:

以数组开头的 JSON 无效。您需要返回如下内容:

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

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

【讨论】:

  • 这不是真的。 JSON 完全有效。
  • @JakeWharton 是对的,我的错。没看到递归数据结构的问题,还以为只是JSON的形成。
猜你喜欢
  • 2017-06-30
  • 1970-01-01
  • 2016-05-07
  • 2012-02-29
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多