预期 BEGIN_ARRAY 但在第 1 行第 5921 列路径 $.data[5].courier.data BEGIN_OBJECT

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 5921 path $.data[5].courier.data

我有这个模型对象 Courier :

public class Courier {
    @SerializedName("data")
    private List<User> data = null;

    public Courier() {
    }

    public Courier(List<User> data) {
        this.data = data;
    }

    public List<User> getData() {
        return data;
    }

    public void setData(List<User> data) {
        this.data = data;
    }
}

我从服务器收到此响应:

{
    "data": [
        {
            "id": 446,
            "courier": {
                "data": []
            },
            "title": "гром",
            "description": "Логойский тракт 24 в России в начале следующей",
            "departure": "ChIJPQKUckNv2UYRLr1NasgXZ08",
            "arrival": "EkHQodC10YDQtdCx0YDRj9C90YvQuSDQv9C10YDQtdGD0LvQvtC6LCDQnNC-0YHQutCy0LAsINCg0L7RgdGB0LjRjw"
        },
        {
            "id": 438,
            "courier": {
                "data": []
            },
            "title": "тест",
            "description": "гппг лмш ш ш ш ш г У меня на сковородке стоит ли брать сва в кино мы все равно обсуждаем",
            "departure": "ChIJH10nmDnP20YR-n7Kq6Whd5w",
            "arrival": "Ej_QnNC-0YHQutCy0L7RgNC10YbQutCw0Y8g0YPQu9C40YbQsCwg0JzQvtGB0LrQstCwLCDQoNC-0YHRgdC40Y8"
        },
        {
            "id": 439,
            "courier": {
                "data": []
            },
            "title": "лаьаьаат",
            "description": "лала слат алс ал ала ал кща да аьад",
            "departure": "ChIJH7D4cTnP20YRKlzSCnP6Mak",
            "arrival": "Ej_QnNC-0YHQutCy0L7RgNC10YbQutCw0Y8g0YPQu9C40YbQsCwg0JzQvtGB0LrQstCwLCDQoNC-0YHRgdC40Y8"
        },
        {
            "id": 442,
            "courier": {
                "data": {
                    "id": 122,
                    "email": null,
                    "phone": "73339999999",
                    "photo": null,
                    "rating": 0
                }
            },
            "title": "картошечка",
            "description": "Крупная сортированная",
            "departure": "ChIJnZRv1jnP20YRWiezW55d1tA",
            "arrival": "ChIJpfH6UJtp1EYRlhM20g-jzF4"
        }
    ]
}

如果对象 courier 没有数据,我得到数组 "data": [],如果对象 courier 有数据,我得到对象:

"courier": {
                "data": {
                    "id": 122,
                    "email": null,
                    "phone": "73339999999",
                    "photo": null,
                    "rating": 0
                }
            }

然后我得到错误...请给我建议如何在 android 应用程序中处理这种情况...

是开始使用JSON客户端时最常见的错误之一,对于android请参考此tutorial了解

理解这种错误的最佳来源是阅读这篇文章 规范的 SO post。

最好阅读并理解它,而不是寻求一个简单的解决方案,因为您会经常遇到此错误。

while deserializing, Gson was expecting a JSON object, but found a JSON array

一个JSON对象被{

包裹

一个JSON数组被一个[

包裹

您需要调整 class Courier,以正确的方式反序列化 JSON 响应。

记住这一点; JSON array 在 java 中被反序列化为 Collection 类型或数组类型; 请注意使用两次数据会造成混淆

最重要的是,第一个数据是

public class MyPojo
{
    private Data[] data;

    public Data[] getData ()
    {
        return data;
    }

    public void setData (Data[] data)
    {
        this.data = data;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [data = "+data+"]";
    }
}

Data.class

public class Data
{
    private String id;

    private String title;

    private String description;

    private Courier courier;

    private String arrival;

    private String departure;

    public String getId ()
    {
        return id;
    }

    public void setId (String id)
    {
        this.id = id;
    }

    public String getTitle ()
    {
        return title;
    }

    public void setTitle (String title)
    {
        this.title = title;
    }

    public String getDescription ()
    {
        return description;
    }

    public void setDescription (String description)
    {
        this.description = description;
    }

    public Courier getCourier ()
    {
        return courier;
    }

    public void setCourier (Courier courier)
    {
        this.courier = courier;
    }

    public String getArrival ()
    {
        return arrival;
    }

    public void setArrival (String arrival)
    {
        this.arrival = arrival;
    }

    public String getDeparture ()
    {
        return departure;
    }

    public void setDeparture (String departure)
    {
        this.departure = departure;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [id = "+id+", title = "+title+", description = "+description+", courier = "+courier+", arrival = "+arrival+", departure = "+departure+"]";
    }
}

Courier.class

public class Courier
{
    private String[] data;

    public String[] getData ()
    {
        return data;
    }

    public void setData (String[] data)
    {
        this.data = data;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [data = "+data+"]";
    }
}

我建议您只创建一个 class Data 字段 idemail 等。并在 class Courier 而不是 List<> data

编辑:然后你可以使用 JsonDeserializer。只需删除 Data 字段上的 @SerializedName("data"),这样 Json 就不会解析该字段。然后创建一个 class:

public class CourierDeserializer implements JsonDeserializer<Courier> {
    @Override
    public Courier deserialize(final JsonElement json, final Type type,
                                  final JsonDeserializationContext context) {
        Courier result = new Gson().fromJson(json, Courier.class);

        try {
            if (json != null) {
                result.setData((Data) context.deserialize(json, Data.class));
            }
        } catch (JsonParseException e) {
            result.setData(null);
        }

        return result;
    }
}

最后在创建 GsonBuilder:

的地方注册它
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Courier.class, new CourierDeserializer());
mGson = gson.create();
builder.setConverter(new GsonConverter(mGson));

如果您使用 Retrofit。