我正在尝试使用 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() {}
}
这里的问题是父类(super class)和子类都不承认“数据”节点。现在,我可以像这样实现子类:
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 来保持整洁。无论如何让 jackson 将“数据”节点视为解析时应该使用的节点?这是我用来进行映射的代码:
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 字段之间的映射。
关于java - Jackson继承——使用@JsonProperty解析子类中的嵌套JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153739/