【发布时间】:2022-01-17 14:12:02
【问题描述】:
我有以下 JSON 字符串和 java 类。 杰森:
{
"records": [
{
"metadata": {
"id": "1129836408668",
"partition": "ecp:9-ca69437a-2ad5-4233-bfc4-fd9aa049569d",
"version": "ecp:9-f66cf504-ba65-48a9-91c0-d1d8229e4899",
"currentAt": "2021-12-07T11:13:50.699Z"
},
"state": {
"effectiveFrom": "2021-12-14T06:35:09.063Z",
"effectiveTo": "2021-12-14T06:35:09.063Z",
"currentFrom": "2021-12-14T06:35:09.063Z",
"currentTo": "2021-12-14T06:35:09.063Z",
"dataItem": {
"ModifiedDate": "2021-12-07T11:13:44.099Z",
"ObjectId": "1129836408668",
"ChangeFlag": "",
"IsUnconfirmed": "false",
"CreatedDate": "2021-12-07T11:13:44.099Z"
}
}
}
],
"index": null
}
A类:
public class ParentClass {
private Date effectiveFrom;
private Date effectiveTo;
private Date currentFrom;
private Date currentTo;
private String id;
}
B类
public class ChildClass extends ParentClass {
@JsonProperty("ModifiedDate")
private Date ModifiedDate;
@JsonProperty("ObjectId")
private String ObjectId;
@JsonProperty("ChangeFlag")
private String ChangeFlag;
@JsonProperty("IsUnconfirmed")
private String IsUnconfirmed;
@JsonProperty("CreatedDate")
private Date CreatedDate;
}
我想用 Jackson 将 state jsonnode 中的值解析为 ChildClass。哪种方法是最好的方法。
我的想法是尝试将state解析为MapA,然后将dateItem解析为MapB,然后将MapB合并到MapA,你会得到一个Mapc,然后将MapC解析为ChildClass。但是,我认为这不是一种有效的方法。那么你们会有更好的解决方案吗?
地图C:
{
effectiveFrom=2021-12-14T06:35:09.063Z,
effectiveTo=2021-12-14T06:35:09.063Z,
currentFrom=2021-12-14T06:35:09.063Z,
currentTo=2021-12-14T06:35:09.063Z,
ModifiedDate=2021-12-07T11:13:44.099Z,
ObjectId=1129836408668,
ChangeFlag=, IsUnconfirmed=false,
CreatedDate=2021-12-07T11:13:44.099Z
}
【问题讨论】:
-
一种可能的替代方法是创建一个
DataItem类,并使用组合而不是继承将其包含在State类中,您尝试过这种方法吗? -
创建一个 State 类不是我想要的方式。到目前为止,我的解决方案是将这个json解析为
Map<String, Object>,然后将所有元素合并到一个Map中,然后将map解析为java bean。 -
我提出的替代方案是用
State state = mapper.readValue(json, State.class)反序列化json文件,可以实现jackson中的继承,在json文件中指示要反序列化的子类的类型。