使用 Jackson 反序列化此 Json 对象?

Deserialize this Json Object using Jackson?

我一直在尝试反序列化从 this API 收到的数据:

{
  "result": "success",
  "timestamp": 1521038012878,
  "data": {
    "GB": 14,
    "DE": 2,
    "US": 2
  },
  "totalIsPublic": true,
  "advanced": false,
  "totalDownloads": {
    "GB": 14,
    "DE": 2,
    "US": 2
  }
}

这是 POJO class:

public class BintrayDownloadCounts {

    private List<Integer> totalDownloads = new ArrayList<>();

    @JsonProperty("totalDownloads")
    public List<Integer> getTotalDownloads() {
        return totalDownloads;
    }

    public void setTotalDownloads(List<Integer> totalDownloads) {
        this.totalDownloads = totalDownloads;
    }
}

当我尝试使用反序列化时:

downloadCounts = mapper.readValue(json, BintrayDownloadCounts.class);

我收到这个错误:

 com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token

我见过很多包含此错误的问题,但我无法针对此特定用例找出解决方案。可能会注意到 totalDownloads 对象是动态的,即它的内容不是常量。

totalDownloads属性不是数组,所以不能映射到List<Integer>。请改用 Map<String, Integer> 并确保您告诉 Jackson 忽略未映射的属性以避免映射错误:

@JsonIgnoreProperties(ignoreUnknown = true)
public class BintrayDownloadCounts {

    @JsonProperty("totalDownloads")
    private Map<String, Integer> totalDownloads;

    public Map<String, Integer> getTotalDownloads() {
        return totalDownloads;
    }

    public void setTotalDownloads(Map<String, Integer> totalDownloads) {
        this.totalDownloads = totalDownloads;
    }
}

那你就可以开始了:

ObjectMapper mapper = new ObjectMapper();
BintrayDownloadCounts downloadCounts = mapper.readValue(json, BintrayDownloadCounts.class);