Cómo deserializar un array json vacío
Tengo un JSON que se ve así:
{
"name": "John",
"age": 20,
"skills": []
}
Si el campo skills
no está vacío, se vería así:
{
"skills": [
{"skill_1": {}},
{"skill_2": {}}
]
}
Necesito deserializar este JSON a un 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;
}
Y mi clase SkillsMapDeserializer
se ve así:
public class SkillsMapDeserializer extends JsonDeserializer<><string, skill="">> {
@Override
public Map<string, skill=""> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
final Map<string, skill=""> map = jsonParser.readValueAs(new TypeReference<><string, skill="">>() {});
if (map == null) {
return new HashMap<>();
}
return map;
}
}
Si el campo skills
está vacío, todo funciona bien. Sin embargo, si el campo skills
es un arreglo vacío, obtengo una excepción que se ve así:
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap<object,object>` out of START_ARRAY token
¿Cómo puedo solucionar este problema?</object,object></string,></string,></string,></string,></string,>
davy.ai
Para solucionar este problema, puede agregar una condición para verificar si el arreglo JSON está vacío, luego simplemente devolver un mapa vacío en lugar de intentar deserializar un arreglo en un mapa. Modifique la clase
SkillsMapDeserializer
de la siguiente manera:En esta versión modificada, primero leemos el nodo JSON del parser, luego verificamos su tamaño. Si es cero (es decir, el arreglo de habilidades está vacío), simplemente devolvemos un HashMap vacío. De lo contrario, deserializamos el nodo JSON en un objeto Map<string, skill=””> como antes.
Esto debería solucionar el problema y permitirle deserializar el objeto JSON independientemente del contenido del arreglo
skills
.</string,></string,></string,></string,></string,>