【问题标题】:Jackson parse different level fields to one java classJackson 将不同级别的字段解析为一个 java 类
【发布时间】: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文件中指示要反序列化的子类的类型。

标签: java json jackson


【解决方案1】:

您实际上并不需要两个类。您只需要一个能够以自定义方式反序列化 dataItem 块的程序。以下几行应该有效:

public class ParentClass {
    
    private Date effectiveFrom;
    private Date effectiveTo;
    private Date currentFrom;
    private Date currentTo;
    private String id;
    
    private Date modifiedDate;
    private String objectId;
    private String changeFlag;
    private String isUnconfirmed;
    private Date createdDate;

    @JsonProperty("dataItem")
    private void unpackNested(Map<String, Object> dataItem) {
        this.modifiedDate = Date.from(Instant.from(DateTimeFormatter.ISO_INSTANT.parse((String) dataItem.get("ModifiedDate"))));
        this.objectId = (String) dataItem.get("ObjectId");
        this.changeFlag = (String) dataItem.get("ChangeFlag");
        this.isUnconfirmed = (String) dataItem.get("IsUnconfirmed");
        this.createdDate = Date.from(Instant.from(DateTimeFormatter.ISO_INSTANT.parse((String) dataItem.get("CreatedDate"))));
    }
    
}

您可以在https://www.baeldung.com/jackson-nested-values 找到其他选项。

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多