【问题标题】:Jackson + Gson + Retrofit Expected BEGIN_OBJECT but was BEGIN_ARRAYJackson + Gson + Retrofit 预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY
【发布时间】:2016-09-26 19:51:27
【问题描述】:

我知道这个问题被问了很多,但是我发现的问题都没有解决我的具体问题。

这是我的 JSON

[JSON URL][1]

[
  {      
    "unit":"IMECA",
    "value":29,
  },
  {
    "unit":"IMECA",
    "value":43,
  }
]

这是我的 DTO

Zona.java

  public class Zona {
  private String unit;
  private int value;

  public String getUnit() {
    return unit;
  }

  public void setUnit(String unit) {
    this.unit = unit;
  }

  public int getValue() {
    return value;
  }

  public void setValue(int value) {
    this.value = value;
  }

  @Override
  public String toString() {
    return String.valueOf(unit) + ": " + String.valueOf(value);
  }
}

这是我的界面

Api.java

public interface Api {
  @GET("/data/heatmap_stations.json")
  Call<Zona> getZona();
}

我有点理解 为什么会发生,因为响应是 JSON 数组,但 Jackson + Gson 期待单个 JSON 对象。

我尝试像这样创建一个 POJO:

Zonas.java

Public class Zonas extends ArrayList<Zona> {}

并更改Interface和Retrofit调用中的Call签名,将单个DTO替换为复数,(从Call到Call,将单个类替换为继承ArrayList的那个),但它根本什么都不做,我的意思是,它没有抛出异常,但它也没有抛出响应。

【问题讨论】:

  • 关于那个确切的错误有很多重复。提示:您返回的是 JSONArray,而不是 JSONObject,因此您可能希望在调用中使用 List&lt;Zona&gt;
  • 另外,Jackson 和 Gson 执行相同的操作,所以我不知道为什么你有两个

标签: android json jackson gson retrofit2


【解决方案1】:

改变

public interface Api {
  @GET("/data/heatmap_stations.json")
  Call<Zona> getZona();
}

public interface Api {
  @GET("/data/heatmap_stations.json")
  Call<List<Zona>> getZona();
}

您告诉它期待一个 Zona 对象,但它返回一个 Zona 对象数组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多