8

我有一个 JSON 字符串,格式如下:

{
  "response": { 
    "execution_status": "ready", 
    "report": {
      "cache_hit": true, 
      "created_on": "2013-07-29 08:42:42", 
      "fact_cache_error": null, 
      "fact_cache_hit": true, 
      "header_info": null, 
      "name": null, 
      "report_size": "5871", 
      "row_count": "33", 
      "url": "report-download?id=278641c223bc4e4d63df9e83d8fcb4e6"
     }, 
  "status": "OK"
  }
}

JSON 的响应部分对于一堆响应类型很常见。此 JSON 的报告部分仅适用于此响应。所以我用 getter 和 setter 创建了一个 Response 类,如下所示(为简洁起见,这里没有包括 getter 和 setter):

@JsonRootName(value = "response")
public class Response implements Serializable {

    private static final long serialVersionUID = -2597493920293381637L;

    @JsonProperty(value = "error")
    private String error;
    @JsonProperty(value = "error_code")
    private String errorCode;
    @JsonProperty(value = "error_id")
    private String errorId;
    @JsonProperty(value = "error_description")
    private String errorDescription;
    @JsonProperty(value = "method")
    private String method;
    @JsonProperty(value = "service")
    private String service;
    @JsonProperty(value = "status")
    private String status;
    @JsonProperty(value = "execution_status")
    private String executionStatus;
}

然后,我创建了一个报表类,其中报表元素中的字段如下所示。ReportResponse 类将从 Response 类扩展(再次为简洁起见,不包括 getter 和 setter):

public class ReportResponse extends Response {

    private static final long serialVersionUID = 4950819240030644407L;

    @JsonProperty(value = "cache_hit")
    private Boolean cacheHit;
    @JsonProperty(value = "created_on")
    private Timestamp createdOn;
    @JsonProperty(value = "fact_cache_error")
    private String factCacheError;
    @JsonProperty(value = "fact_cache_hit")
    private Boolean factCacheHit;
    @JsonProperty(value = "header_info")
    private String headerInfo;
    @JsonProperty(value = "json_request")
    private String jsonRequest;
    @JsonProperty(value = "name")
    private String name;
    @JsonProperty(value = "report_size")
    private Integer reportSize;
    @JsonProperty(value = "row_count")
    private Integer rowCount;
    @JsonProperty(value = "url")
    private String url;
}

现在,当我使用 ObjectMapper 映射到 ReportResponse 对象时,出现以下错误:

String jsonString = "{\"response\": {\"execution_status\": \"ready\", \"report\":   {\"cache_hit\": true, \"created_on\": \"2013-07-29 09:53:44\", \"fact_cache_error\": null, \"fact_cache_hit\": false, \"header_info\": null, \"name\": null, \"report_size\": \"5871\", \"row_count\": \"33\", \"url\": \"report-download?id=2ff62c07fc3653b68f2073e7c1aa0517\"}, \"status\": \"OK\"}}";
ObjectMapper mapper = new ObjectMapper();
ReportResponse reportResponse = mapper.readValue(jsonString, ReportResponse.class);

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "report"

我知道我可以创建一个单独的 Report 类,然后使用 @JsonProperty 注释将其嵌入到 ReportResponse 中。有没有办法可以避免这种情况并使用注释标记 ReportResponse 类,该注释会将其映射到 JSON 中的“报告”元素?

4

2 回答 2

9

目前还没有可以处理这种情况的注释。有一张请求此功能的票。

以下是一位业主关于此主题的简短声明。

引用上述声明:

Tatu Saloranta:“……@JsonProperty 不支持转换,因为数据绑定基于增量解析并且无法访问完整的树表示。支持 @JsonUnwrapped 并不简单,但可行;因此相反(“@JsonWrapped” )从理论上讲是可行的。只是大量的工作。......“

于 2013-07-29T10:24:47.750 回答
1

我在您的代码中看到了几个问题。首先,您的 Response 类中没有report属性,根据您显示的 json 结构,这是必需的。其次,您需要在 bean 类中提供 getter 和 setter,因为 jackson 将使用它们来编组和解组 json/object。

于 2013-07-29T10:10:06.953 回答