【问题标题】:Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 5921 path $.data[5].courier.data预期为 BEGIN_ARRAY,但在第 1 行第 5921 列路径 $.data[5].courier.data 处为 BEGIN_OBJECT
【发布时间】:2018-01-26 10:26:52
【问题描述】:

我有这个模型对象 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应用程序中处理这种情况...

【问题讨论】:

    标签: java android json response


    【解决方案1】:

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

    了解此类错误的最佳来源是阅读此post 一个规范的 SO 帖子。

    最好阅读并理解它,要求一个简单的解决方案,因为你会经常遇到这个错误。

    在反序列化时,Gson 期待一个 JSON 对象,但发现了一个 JSON数组

    JSON 对象由 { 包装

    一个 JSON 数组由 [ 包裹

    您需要调整您的类 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+"]";
        }
    }
    

    【讨论】:

      【解决方案2】:

      我建议你只创建一个类Data,其中包含idemail 等字段。并在Courier 类中创建字段Data data 而不是List&lt;&gt; data

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

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

      如果你使用改造。

      【讨论】:

      • 抱歉,但不,它会出错 - 预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY
      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2020-01-06
      • 2017-07-17
      • 2016-06-08
      • 1970-01-01
      • 2018-01-05
      相关资源
      最近更新 更多