杰克逊 - 反序列化嵌套的JSON

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报告部分仅适用于此响应。因此,我创建了一个Response类,如下所示,具有getter和setter(出于简洁起见,此处未包含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;
}

然后,我创建了一个Report类,并将报告元素中的字段作为以下内容。 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中的“report”元素?

2个回答

9
目前还没有注解可以处理这种情况。有一个请求此功能的票据。点击此处查看。 以下是其中一位所有者对此主题的简要声明。点击此处查看。 引用上述声明:
Tatu Saloranta:“…@JsonProperty不支持转换,因为数据绑定基于增量解析并且无法访问完整的树形表示。支持@JsonUnwrapped是不平凡的,但是可以做到;因此相反(“@JsonWrapped”)理论上可行。只需要大量工作。…”

谢谢nutlike。你知道这种情况的解决方法吗?还是说我需要创建一个不必要的包装器? - Anand
@Anand:我认为你必须使用这个不必要的包装器 - 我暂时想不到其他的解决方案。也许其他人能想出别的办法。祝你好运! - nutlike
2
他们不再使用Jira进行问题跟踪。新问题:https://github.com/FasterXML/jackson-databind/issues/512 - freethejazz
希望他们最终能够实现这个! - Nicholas DiPiazza

1
我看到你的代码中有几个问题。首先,根据你展示的json结构,你的Response类中缺少必需的report属性。其次,你需要在你的bean类中提供getter和setter方法,这些方法将被jackson用于json /对象的编排和解析。

Juned - 为了简洁起见,我在这篇文章中没有包含getter和setter。它将占用大量空间,因此我已经省略了它们。我知道我需要为jackson创建一个报告元素来解组JSON。我的问题是想知道是否有一种方法可以将ReportResponse标记为报告元素,以便我不必创建另一个类。 - Anand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接