[英]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.