【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT error with gson, android, retrofit预期 BEGIN_ARRAY 但在 gson、android、改造时出现 BEGIN_OBJECT 错误
【发布时间】:2019-10-01 15:42:54
【问题描述】:

您好,我正在尝试从 API 获取数据,但出现下一个错误:

应为 BEGIN_ARRAY,但为 BEGIN_OBJECT

我得到的数据如下:

 "code": "01",
    "data": {
        "code": "0",
        "time": "14-05-2019 16:22:28.661",
        "data": [
            {
                "geometry": {
                    "BoundingBox": null,
                    "ExtraMembers": null,
                    "Type": 7,
                    "Coordinates": {
                        "Latitude": 40.401609,
                        "Values": [
                            -3.674735,
                            40.401609
                        ],
                        "Longitude": -3.674735
                    },
                    "CoordinateReferenceSystem": null
                }
            },
            {
                "geometry": {
                    "BoundingBox": null,
                    ....

获取此数据的 pojo 是下一个:

public class ApiResponse<T extends ApiResponseData> {
    ...   
    @SerializedName("data")
    @Expose
    private List<T> data;
    ...
}

public class DData implements ApiResponseData {
...

接下来是获取数据的改造调用:

public void getListOfDs(final MutableLiveData<ApiResponse<DData>> data) {
        Call<ApiResponse<DData>> call = CApiInterface.getListOfDs(ID_CLIENT);
        call.enqueue(new Callback<ApiResponse<DData>>() {
            @Override
            public void onResponse(Call<ApiResponse<DData>> call, Response<ApiResponse<DData>> response) {
                ApiResponse<DData> apiResponse = response.body();
                data.setValue(apiResponse);
            }

            @Override
            public void onFailure(Call<ApiResponse<DData>> call, Throwable t) {
                data.setValue(createFailedResponse());
                call.cancel();
            }
        });
    }

问题是为什么我会收到此错误,在 ApiResponse 中,在这种情况下我有一个列表,我得到一个 DData 的列表,对于另一种情况,例如响应只有一个 DData这项工作完美有什么想法吗?

知道如何解决吗?

谢谢。

【问题讨论】:

    标签: android gson retrofit2


    【解决方案1】:

    您正在尝试将数据对象反序列化为列表,但层次结构中的第一个“数据”是一个对象,这是导致异常的原因。 您需要检查您的 Pojo 类以适应 Json 结构。

    也许这样的事情可以工作:

    public class ApiResponse<T extends ApiResponseData> {
        ...
        @SerializedName("data")
        @Expose
        private Data<T> data;
        ...
    }
    
    public class Data<T extends ApiResponseData>  {
    
        @SerializedName("code")
        @Expose
        private String code;
    
        @SerializedName("time")
        @Expose
        private String time;
    
        @SerializedName("data")
        @Expose
        private List<T> data;
    
        ...
    }
    

    【讨论】:

    • 但是“数据”是对象"data": [{的列表
    • json中有两个“数据”
    【解决方案2】:

    “Data”键是两次,顶部的一个是对象类型,但它应该是列表/数组类型。你的回答应该用括号[] 目前 {} 代表 Json 对象,而不是列表。

    参考这里了解 JSONArray 和 JSONObject 之间的区别 Difference between JSONObject and JSONArray

    【讨论】:

    • 我在数据中的回复,即问题是对象列表"data": [ {
    • @Tlaloc-ES 我刚刚更新了它。 “数据”键是两次。第一个是 JsonObject
    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 2015-07-24
    • 2020-07-26
    • 2017-02-14
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多