如何反序列化 json 空数组

How to deserialize json empty array

我有一个 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

我该如何解决这个问题?

技能不是地图。它应该是对象列表。尝试修改您的 POJO,如下所示:-

public class Profile {

    @JsonProperty("name")
    private String name;
    @JsonProperty("age")
    private Integer age;
    @JsonProperty("skills")
    private List < Object > skills = null;

    @JsonProperty("name")
    public String getName() {
        return name;
    }

    @JsonProperty("name")
    public void setName(String name) {
        this.name = name;
    }

    @JsonProperty("age")
    public Integer getAge() {
        return age;
    }

    @JsonProperty("age")
    public void setAge(Integer age) {
        this.age = age;
    }

    @JsonProperty("skills")
    public List < Object > getSkills() {
        return skills;
    }

    @JsonProperty("skills")
    public void setSkills(List < Object > skills) {
        this.skills = skills;
    }

}

从你的json数据来看,技能似乎是一个对象数组。

"skills": [],
 "skills": [
   "skill_1": {}, 
   "skill_2": {}
 ]

但是您的 java 将其定义为 Map

public Map<String, Skill> skills;

这就是为什么您在尝试将数组直接转换为映射时出现异常的原因。 如果您不能更改 POJOs 配置文件,您应该有一个将列表转换为地图的中间步骤。

public class SkillsMapDeserializer extends JsonDeserializer<Map<String, Skill>> {
    @Override
    public Map<String, Skill> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        final List<Map<String,Skill>> skills = jsonParser.readValueAs(new TypeReference<List<Map<String,Skill>>>>() {
        });
        return functionConvertListToMapWithParam(skills);
    }
}