如何使用具有相同值结构的动态键数反序列化列表?

How to deserialize list with dynamic number of keys with same value structure?

我正在尝试找到一种最佳方法来反序列化所有包含相同值对象结构的动态字段:

"data": {
    "lastUpdate": 1605299294253,
    "tableData": [
        {
            "recordId": 1,
            "isSelected": 1,
            "myKey1": {
                "valueRef": 72,
                "value": "Some value"
            },
            "myKey2": {
                "valueRef": 0,
                "value": "123"
            }
        }
    ]
}

对于 tableData JSON 数组,我试过这种方法但没有成功:

import lombok.Data;
import java.util.Map;

@Data
public class TableRowDataVO {
    private Integer recordId;
    private Integer recordStatus;
    private Map<String, TableRowDetailVO> columnData1;
    private Map<String, TableRowDetailVO> columnData2;
}

此 class 嵌套到另一个 class 中以包含 data 中的整个 JSON 主体:

public class TabularDataDTO {
    private Long lastUpdate;
    private List<TableRowDataVO> tableData;
}

并且每个动态字段都包含以下类型的相同对象:

public class TableRowDetailVO {
    private Integer valueRef;
    private String value;
}

也不能保证只有2个动态键。它可以是 TableRowDataVO 中的 0 到许多动态键,但如果存在要求我使用 2 解决的限制,我可以这样做,但如果 0 到许多动态字段是可能的,那就太好了。我正在尝试将 ObjectMapper 与 TypeReference 用作 TabularDataVO 但它会引发异常。设计我的对象以使 TabularDataVO 可以被映射器反序列化的正确方法是什么?

为了正确理解你的问题。您 Json 如下所示:-

"data": {
    "lastUpdate": 1605299294253,
    "tableData": [
        {
            "recordId": 1,
            "isSelected": 1,
            "myKey1": {
                "valueRef": 72,
                "value": "Some value"
            },
            "myKey2": {
                "valueRef": 0,
                "value": "123"
            }
        }
    ]
}

不喜欢

"data": {
    "lastUpdate": 1605299294253,
    "tableData": [
        {
            "recordId": 1,
            "isSelected": 1,
            "keys": [
                 {
                   "valueRef": 72,
                   "value": "Some value"
                },
                {
                  "valueRef": 0,
                  "value": "123"
               }
           ]
        }
    ]
}

后者可以使用 jackson 库轻松反序列化并将键定义为 List>

由于密钥是动态的,因此当您处理数据时,您需要一些特殊的过程。

@Data
public class NewDTO {
    private Long lastUpdate;
    private List<Map<String, Object>> tableData;
}