我有一个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条答案
按热度按时间v64noz0r1#
从你的JSON数据来看,似乎 skills 是一个对象数组。
但Java代码将其定义为 Map:
这就是为什么在尝试将数组直接转换为map时会出现异常。如果你不能改变POJO的配置文件,你应该有一个中间步骤来转换列表到一个Map。
gzjq41n42#
技能不是Map。它应该是对象列表。试着修改你的POJO如下:-