簡體   English   中英

Jackson繼承-使用@JsonProperty在子類中解析嵌套的JSON

[英]Jackson inheritance - parsing nested JSON in a subclass using @JsonProperty

我正在嘗試使用Jackson來解析網絡響應。 所有回復均遵循以下一般格式:

{
  "status": {
    "code": 0,
    "message": "ok",
    "version": 1
  },
  "data": {
    "accountId": 1111,
    "handle": "mark",
    "stats": {
       "wins": 11,
       "losses": 43
    }
  }
}

“狀態”節點在所有對象之間共享,而“數據”節點將因響應而異。 我的想法是創建一個處理“狀態”節點解析的NetworkResponse類,然后創建許多從NetworkResponse繼承的對象,這些對象解析我得到的不同NetworkResponses。

到目前為止,我是針對基類制作的:

public class NetworkResponse {
    @JsonProperty("status") protected StatusNode statusNode;

    public NetworkResponse() { }
}

然后是一個子類,它將解析上述網絡響應:

public class PlayerInfoResponse extends NetworkResponse {
    @JsonProperty("accountId") private String accountId;
    @JsonProperty("handle") private String handle;
    @JsonProperty("stats") private PlayerStats playerStats;

    public PlayerInfoResponse() {}
}

這里的問題是父類或子類都不承認“數據”節點。 現在,我可以像這樣實現子類:

public class PlayerInfoResponse extends NetworkResponse {
    private String accountId;
    private String handle;
    private PlayerStats playerStats;

    @JsonProperty("data") public JsonNode dataNode;
    public void setDataNode(JsonNode dataNode) {
            // parse out data manually 
    }

    public PlayerInfoResponse() {}
}

這行得通,但我想使用@JsonProperty保持所有整理。 無論如何,有沒有讓傑克遜將“數據”節點視為解析時應使用的節點? 這是我用來進行映射的代碼:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
PlayerInfoResponse info = objectMapper.readValue(jsonResponse, PlayerInfoResponse.class);

謝謝!

有兩種方法可以解決此問題。

最簡單的方法就是重組您的響應。

public abstract class NetworkResponse {
  @JsonProperty("status") private StatusNode statusNode;
  // getters and setters
}

public class PlayerInfoResponse extends NetworkResponse {
    private PlayerData data;

    public static class PlayerData {
      private String accountId;
      private String handle;
      @JsonProperty("stats") private PlayerStats playerStats;

      // getters and setters
    }
    // getters and setters
 }  

如果您注意到,您在播放器響應對象中未定義json字段數據

另外,@ JsonProperty僅允許您重命名Java bean字段與其json對應項之間的映射。

暫無
暫無

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

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