【发布时间】:2022-01-13 07:41:47
【问题描述】:
我的 JSON 如下所示:
{
"name": "John",
"age": 20,
"skills": [
]
}
skills 如果不为空,则如下所示:
{
"skills": [
"skill_1": {
},
"skill_2": {
}]
}
我需要将此 JSON 反序列化为 POJO:
public class Profile {
public String name;
public int age;
@JsonDeserialize(using = SkillsMapDeserializer.class)
public Map<String, Skill> skills;
}
public class Skill {
public String skillName;
public int age;
}
我的SkillsMapDeserializer 如下所示:
public class SkillsMapDeserializer extends JsonDeserializer<Map<String, Skill>> {
@Override
public Map<String, Skill> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
final Map<String, Skill> map = jsonParser.readValueAs(new TypeReference<Map<String, Skill>>() {
});
if (map == null) {
return new HashMap<>();
}
return map;
}
}
如果skills 不是空的,一切正常,但如果skills 是一个空数组,我会收到如下所示的异常:
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap<java.lang.Object,java.lang.Object>` out of START_ARRAY token
我该如何解决这个问题?
【问题讨论】:
-
解决方法:使用 2 个步骤:首先将值作为技能列表读取,检查是否为空,如果不是,将值添加到地图中
标签: java json jackson jackson-databind