我知道通过以下方式将JSON字符串转换为Map<String, String>
的实现:
public <T1, T2> HashMap<T1, T2> getMapFromJson(String json, Class<T1> keyClazz, Class<T2> valueClazz) throws TMMIDConversionException {
if (StringUtils.isEmpty(json)) {
return null;
}
try {
ObjectMapper mapper = getObjectMapper();
HashMap<T1, T2> map = mapper.readValue(json, TypeFactory.defaultInstance().constructMapType(HashMap.class, keyClazz, valueClazz));
return map;
} catch (Exception e) {
Logger.error(e.getMessage(), e.getCause());
}
}
但我无法扩展它以将我的JSON转换为Map<String, Set<String>>
。显然,上面的方法失败了,因为它打破了Set项并放入列表中。需要一些帮助!!感谢
示例JSON字符串如下所示。此JSOn必须转换为Map<String, Set<CustomClass>>
。
{
"0": [
{
"cid": 100,
"itemId": 0,
"position": 0
}
],
"1": [
{
"cid": 100,
"itemId": 1,
"position": 0
}
],
"7": [
{
"cid": 100,
"itemId": 7,
"position": -1
},
{
"cid": 140625,
"itemId": 7,
"position": 1
}
],
"8": [
{
"cid": 100,
"itemId": 8,
"position": 0
}
],
"9": [
{
"cid": 100,
"itemId": 9,
"position": 0
}
]
}
答案 0 :(得分:11)
试试这个:
JavaType setType = mapper.getTypeFactory().constructCollectionType(Set.class, CustomClass.class);
JavaType stringType = mapper.getTypeFactory().constructType(String.class);
JavaType mapType = mapper.getTypeFactory().constructMapType(Map.class, stringType, setType);
String outputJson = mapper.readValue(json, mapType)
答案 1 :(得分:1)
不幸的是Class
实际上无法表达泛型类型;因此,如果您的值类型是通用的(例如Set<String>
),则需要传递JavaType
。这也可用于构建结构化JavaType
实例。