我该如何为字符串和数组设置常规值类型?

时间:2019-03-15 08:13:38

标签: json jackson jackson-databind

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

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

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

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

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

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

这样我就可以通过密钥获取并将值按需转换为StringString[](或List<String>)。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

使用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]}

第二个解决方案要求您检查是否为ListString。第一种解决方案使您可以将每个值都视为List,并且您有很多简洁的解决方案。第三种选择是使用POJOList属性创建String,并且Jackson将自动匹配并解析给定的JSON