【问题标题】:ObjectMapper mapping not reading data properly for List<Map>ObjectMapper 映射未正确读取 List<Map> 的数据
【发布时间】:2020-06-04 12:53:36
【问题描述】:

我有一个DataResponseDto.json

{
  "data": [
    {
      "customRule": {
        "code": null,
        "executionType": "ON_SUCCESS",
        "description": "Description",
        "owners": null,
        "type": "TWO",
        "enabled": true,
        "objectType": "TEST",
        "syncObjectKPIs": null,
        "inactive": false,
        "responsible": null,
        "id": "0AB58A47D3A64B56A6B74DA0E66935DD",
        "embedded": true,
        "value": null,
        "variables": [],
        "kafkaEventName": null,
        "lastChanged": 1530091858490,
        "createPerson": null,
        "externalId": null,
        "groups": null,
        "eventType": "UPDATE",
        "branches": null,
        "executionOrder": null,
        "createDateTime": null,
        "cronExpression": null,
        "udfMetaGroups": null,
        "name": "Sample1",
        "location": null,
        "permissionsType": "USER",
        "udfValues": null,
        "conditions": null,
        "actions": [
          {
            "name": "ChecklistInstance",
            "parameters": {
              "templateName": "checklist"
            }
          }
        ],
        "syncStatus": "IN_CLOUD",
        "executionLog": []
      },
      "customRule": {
        "code": null,
        "executionType": "ON_SUCCESS",
        "description": "Description",
        "owners": null,
        "type": "TWO",
        "enabled": true,
        "objectType": "TEST",
        "syncObjectKPIs": null,
        "inactive": false,
        "responsible": null,
        "id": "5033296D138C45C385AC141E1157B4FE",
        "embedded": true,
        "value": null,
        "variables": [],
        "kafkaEventName": null,
        "lastChanged": 1530091858490,
        "createPerson": null,
        "externalId": null,
        "groups": null,
        "eventType": "UPDATE",
        "branches": null,
        "executionOrder": null,
        "createDateTime": null,
        "cronExpression": null,
        "udfMetaGroups": null,
        "name": "Sample2",
        "location": null,
        "permissionsType": "USER",
        "udfValues": null,
        "conditions": null,
        "actions": [
          {
            "name": "ChecklistInstance",
            "parameters": {
              "templateName": "checklist"
            }
          }
        ],
        "syncStatus": "IN_CLOUD",
        "executionLog": []
      }
    }],
  "pageSize": 1,
  "currentPage": 0,
  "lastPage": 0,
  "totalObjectCount": 1,
  "truncated": false
}

我有一个类来映射这个 JSON 文件。

public class DataResponseDto {
    private List<Map> data;
    private Integer pageSize;
    private Integer currentPage;
    private Integer lastPage;
    private Long totalObjectCount;
    private Boolean truncated;

// getter setter

...
}

现在我正在使用 ObjectMapper 将此 JSON 解析为 java 类。它检索 DataResponseDto 数据中只有 1 个映射。数据中应该是 2 个地图。

类加载器 classLoader = ClassLoader.getSystemClassLoader(); 文件 file = new File(classLoader.getResource("mock/DataResponseDto.json").getFile());

ObjectMapper mapper = new ObjectMapper();
DataResponseDto dataResponseDto = mapper.readValue(file, DataResponseDto.class);
List<RuleDto> rules = dataResponseDto.getData().stream().map(m -> mapper.convertValue(m.get("customRule"), RuleDto.class)).collect(Collectors.toList());

我得到 rules.size() = 1,它应该是 2

【问题讨论】:

  • 两个条目都有“customRule”键是否重要?

标签: java spring spring-boot spring-mvc objectmapper


【解决方案1】:

您的问题在于private List&lt;Map&gt; data; Map 不能有重复的键,请考虑使用其他内容,例如 apache commons (org.apache.commons.collections.map.MultiKeyMap) 中的 MultiKeyMap

【讨论】:

    【解决方案2】:

    您有重复的密钥customRule。尝试使用规则将customRules 设为数组并重新运行代码。

    【讨论】:

    • 哦,我明白了,我将无法更改数据类型/数据。我们还有其他选择吗
    • 您可以通过在使用正则表达式将字符串解析为 JSONObject 之前对其进行操作来解决此问题。规范说它只会保留最后一个键/值对并覆盖现有的对。
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多