簡體   English   中英

傑克遜 - 反序列化嵌套的JSON

[英]Jackson - Deserialize nested JSON

我有一個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類,其中包含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 anotation將其嵌入到ReportResponse中。 有沒有辦法可以避免這種情況,並使用注釋標記ReportResponse類,該注釋會將其映射到JSON中的“report”元素?

沒有注釋可以處理這種情況。 有一張票要求此功能。

以下是其中一位業主關於此主題的簡短聲明。

引用上述聲明:

Tatu Saloranta:“... @JsonProperty不支持轉換,因為數據綁定基於增量解析,並且無法訪問完整的樹表示。支持@JsonUnwrapped非常重要,但是可行;因此相反(”@JsonWrapped“從理論上講,這是可行的。只需要做很多工作......“

我在你的代碼中看到了幾個問題。 首先,您的Response類中沒有report屬性,這是根據您顯示的json結構所必需的。 其次,你需要在你的bean類中提供getter和setter,因為jackson將使用json / object的marhsalling和unmarshalling。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM