如何反序列化 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);
}
}
我有一个 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);
}
}