如何反序列化空JSON数组

r3i60tvu  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(163)

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

如何解决此问题?

v64noz0r

v64noz0r1#

从你的JSON数据来看,似乎 skills 是一个对象数组。

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

但Java代码将其定义为 Map

public Map<String, Skill> skills;

这就是为什么在尝试将数组直接转换为map时会出现异常。如果你不能改变POJO的配置文件,你应该有一个中间步骤来转换列表到一个Map。

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);
    }
}
gzjq41n4

gzjq41n42#

技能不是Map。它应该是对象列表。试着修改你的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;
    }

}

相关问题