繁体   English   中英

Jackson 将不同级别的字段解析为一个 java class

[英]Jackson parse different level fields to one java class

我有以下 JSON 字符串和 java class。 Json:

{
    "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
}

Class A:

public class ParentClass {
    
    private Date effectiveFrom;
    private Date effectiveTo;
    private Date currentFrom;
    private Date currentTo;
    private String id;
}

Class 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块。 遵循以下原则的东西应该可以工作:

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找到其他选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM