es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , ,

Answer

  1. Avatar for 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:

    public class SkillsMapDeserializer extends JsonDeserializer<><string, skill="">> {
        @Override
        public Map<string, skill=""> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            JsonNode node = jsonParser.getCodec().readTree(jsonParser);
            if (node.size() == 0) {
                return new HashMap<>();
            }
            final Map<string, skill=""> map = jsonParser.getCodec().readValue(jsonParser, new TypeReference<><string, skill="">>() {
            });
            return map;
        }
    }
    

    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,>

Comments are closed.