简体   繁体   English

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

[英]Jackson - Deserialize nested JSON

I have a JSON string which will be of the following format: 我有一个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"
  }
}

The response part of the JSON is common for a bunch of response types. JSON的响应部分对于一堆响应类型是常见的。 The report part of this JSON holds good only for this response. 此JSON的报告部分仅适用于此响应。 So I had created a Response class as shown below with getters and setters (have not included the getters and setters here for brevity): 所以我创建了一个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;
}

And then, I created a Report class with the fields in the report element as below. 然后,我创建了一个Report类,其中包含report元素中的字段,如下所示。 The ReportResponse class will extend from the Response class (again the getters and setters are not included for brevity): 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;
}

Now when I use the ObjectMapper to map to the ReportResponse object, I get the following error: 现在当我使用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"

I know that I can create a separate Report class and then embed it in the ReportResponse with the @JsonProperty anotation. 我知道我可以创建一个单独的Report类,然后使用@JsonProperty anotation将其嵌入到ReportResponse中。 Is there a way I can avoid that and mark the ReportResponse class with an annotation which would map it to the "report" element in the JSON? 有没有办法可以避免这种情况,并使用注释标记ReportResponse类,该注释会将其映射到JSON中的“report”元素?

There is no annotation which could handle this case yet. 没有注释可以处理这种情况。 There is a ticket requesting this feature. 有一张票要求此功能。

Here is a brief statement from one of the owners regarding this topic. 以下是其中一位业主关于此主题的简短声明。

Quote from the mentioned statement: 引用上述声明:

Tatu Saloranta: "… @JsonProperty does not support transformations, since the data binding is based on incremental parsing and does not have access to full tree representation. Supporting @JsonUnwrapped was non-trivial, but doable; and thus converse ("@JsonWrapped") would be doable, theoretically speaking. Just plenty of work. …" Tatu Saloranta:“... @JsonProperty不支持转换,因为数据绑定基于增量解析,并且无法访问完整的树表示。支持@JsonUnwrapped非常重要,但是可行;因此相反(”@JsonWrapped“从理论上讲,这是可行的。只需要做很多工作......“

I see couple of problems in your code. 我在你的代码中看到了几个问题。 First thing is that you don't have report attribute in your Response class, which is required as per the json structure you have shown. 首先,您的Response类中没有report属性,这是根据您显示的json结构所必需的。 Secondly you need to provide the getters and setters in your bean classes as those will be used by the jackson for marhsalling and unmarshalling of json/object. 其次,你需要在你的bean类中提供getter和setter,因为jackson将使用json / object的marhsalling和unmarshalling。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM