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