Retrofit 2、GSON 和自定义解析

Retrofit 2, GSON and custom parsing

我正在使用 Retrofit2、Gson 来获取和解析数据。现在,我得到以下响应,创建 POJO 类 不起作用 -

[
  {
    "state": "Tripura",
    "districtData": [
      {
        "district": "Gomati",
        "confirmed": 1,
        "lastupdatedtime": "",
        "delta": {
          "confirmed": 0
        }
      },
      {
        "district": "North Tripura",
        "confirmed": 1,
        "lastupdatedtime": "",
        "delta": {
          "confirmed": 0
        }
      }
    ]
  },
  {
    "state": "Nagaland",
    "districtData": [
      {
        "district": "Dimapur",
        "confirmed": 1,
        "lastupdatedtime": "",
        "delta": {
          "confirmed": 0
        }
      }
    ]
  }
]

我无法从此响应中获取正确的数据。我已经阅读了有关改装的自定义 JSON 解析(例如 - https://medium.com/@andersonk/retrofit-2-custom-deserializer-for-unwrapping-properties-8cb8b2ec901e ),但它对我不起作用。 此外,Whosebug 中与此相关的问题与特定 Json 响应相关,而不是通用响应。

请提供有用的link/相同的解决方案

请检查您的 POJO class

 -----------------------------------com.example.Delta.java-----------------------------------

    package com.example;

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;

    public class Delta {

    @SerializedName("confirmed")
    @Expose
    private Integer confirmed;

    public Integer getConfirmed() {
    return confirmed;
    }

    public void setConfirmed(Integer confirmed) {
    this.confirmed = confirmed;
    }

    }
    -----------------------------------com.example.DistrictDatum.java-----------------------------------

    package com.example;

    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;

    public class DistrictDatum {

    @SerializedName("district")
    @Expose
    private String district;
    @SerializedName("confirmed")
    @Expose
    private Integer confirmed;
    @SerializedName("lastupdatedtime")
    @Expose
    private String lastupdatedtime;
    @SerializedName("delta")
    @Expose
    private Delta delta;

    public String getDistrict() {
    return district;
    }

    public void setDistrict(String district) {
    this.district = district;
    }

    public Integer getConfirmed() {
    return confirmed;
    }

    public void setConfirmed(Integer confirmed) {
    this.confirmed = confirmed;
    }

    public String getLastupdatedtime() {
    return lastupdatedtime;
    }

    public void setLastupdatedtime(String lastupdatedtime) {
    this.lastupdatedtime = lastupdatedtime;
    }

    public Delta getDelta() {
    return delta;
    }

    public void setDelta(Delta delta) {
    this.delta = delta;
    }

    }
    -----------------------------------com.example.Example.java-----------------------------------

    package com.example;

    import java.util.List;
    import com.google.gson.annotations.Expose;
    import com.google.gson.annotations.SerializedName;

    public class Example {

    @SerializedName("state")
    @Expose
    private String state;
    @SerializedName("districtData")
    @Expose
    private List<DistrictDatum> districtData = null;

    public String getState() {
    return state;
    }

    public void setState(String state) {
    this.state = state;
    }

    public List<DistrictDatum> getDistrictData() {
    return districtData;
    }

    public void setDistrictData(List<DistrictDatum> districtData) {
    this.districtData = districtData;
    }

    }

我猜,由于响应是列表,所以这就是导致错误的原因。

如果你像这样声明你的 POJO

public class ResponseData {

@SerializedName("state")
@Expose
public String state;
@SerializedName("districtData")
@Expose
public List<DistrictDatum> districtData = null;

}

然后您需要在改造中更改 Call 对象的参数,使其看起来像这样:

Call<ArrayList<ResponseData> loadDataFromApi();

编辑:DistrictDatum 还必须是 class 字段来自 API。