首页 > 解决方案 > 如何为字符串和数组做一般值类型?

问题描述

我需要从远程服务解析一些 JSON 数据。

请求和/或响应文档如下所示。

{
  "some": "...",
  "someOther": [
    "...",
    "..."
  ],
  "youDontKnow": "...",
  "mayBeThis": [
    "what"
  ]
}

如您所见,我认为只有值stringarray值。

现在,我不想映射每个字段,而是想知道是否有任何方法可以使用以下映射。

Map<String, Object> map; // each value may be string or array

这样我就可以按键获取并按需将值转换为 aString或 a String[](或)。List<String>

我怎样才能做到这一点?

标签: jsonjacksonjackson-databind

解决方案


使用时,DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY您可以将所有值视为List-s。

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);


MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, String.class, List.class);
Map<String, List> map = mapper.readValue(jsonFile, mapType);
System.out.println(map);

印刷:

{some=[...], someOther=[..., ...], youDontKnow=[...], mayBeThis=[what]}

没有它,您可以使用创建适当类型的默认行为:

ObjectMapper mapper = new ObjectMapper();

Map<String, Object> map = mapper.readValue(jsonFile, Map.class);
System.out.println(map);

印刷:

{some=..., someOther=[..., ...], youDontKnow=..., mayBeThis=[what]}

第二种解决方案需要您检查它是否是Listos String。第一个解决方案允许您将每个值视为List并且您有很多简洁的解决方案。第三个选项是创建POJOwith ListString属性并Jackson自动匹配和解析给定JSON的。


推荐阅读