Saltar al contenido

Uso de Jackson ObjectMapper con valores opcionales de Java 8

Solución:

Puede usar jackson-datatype-jdk8, que se describe como:

Soporte para nuevos tipos específicos de JDK8, como Opcional

Para hacer esto:

  • agregar com.fasterxml.jackson.datatype:jackson-datatype-jdk8 como una dependencia
  • registre el módulo con su mapeador de objetos: objectMapper.registerModule(new Jdk8Module());

los Optional la clase tiene un value field, pero no un getter / setter estándar para él. De forma predeterminada, Jackson busca captadores / definidores para encontrar propiedades de clase.

Puede agregar un Mixin personalizado para identificar el campo como una propiedad

final class OptionalMixin {
    private Mixin(){}
    @JsonProperty
    private Object value;
}

y regístrelo con su ObjectMapper.

ObjectMapper mapper = new ObjectMapper();
mapper.addMixInAnnotations(Optional.class, OptionalMixin.class);

Ahora puede serializar su objeto.

System.out.println(mapper.writeValueAsString(new Test()));

imprimirá

{"field":{"value":"hello, world!","present":true}}

Considere también mirar jackson-datatype-guava. Hay un jackson Module implementación para los tipos de guayaba, incluyendo su Optional. Posiblemente sea más completo de lo que he mostrado arriba.

Similar a la respuesta de @ Manikandan pero agregue @JsonProperty al campo privado en lugar de un captador para que no exponga su trabajo en la API pública.

public class Test {

    @JsonProperty("field")
    private String field;

    @JsonIgnore
    public Optional<String> getField() {
        return Optional.of(field); // or Optional.ofNullable(field);
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *