Dariusz Kuc
05/21/2021, 9:49 PMsealed class OptionalInput<out T> {
/**
* Represents missing/undefined value.
*/
object Undefined : OptionalInput<Nothing>() {
override fun toString() = "UNDEFINED"
}
/**
* Wrapper holding explicitly specified value including NULL.
*/
class Defined<out U> @JsonCreator constructor(@JsonValue val value: U?) : OptionalInput<U>() {
override fun toString(): String = "Defined(value=$value)"
}
}
@JsonFilter(value = "optionalInputFilter")
data class InputObject(
val name: OptionalInput<String>,
val value: OptionalInput<Int>
)
class OptionalInputFilter : SimpleBeanPropertyFilter() {
override fun serializeAsField(
pojo: Any?,
jgen: JsonGenerator,
provider: SerializerProvider,
writer: PropertyWriter
) {
if (pojo is OptionalInput.Undefined) { // pojo is an instance of InputObject, this does not get invoked for fields
writer.serializeAsOmittedField(pojo, jgen, provider)
} else {
writer.serializeAsField(pojo, jgen, provider)
}
}
}
val mapper = jacksonObjectMapper()
val filters = SimpleFilterProvider().addFilter("optionalInputFilter", OptionalInputFilter())
val notSpecified = InputObject(name = OptionalInput.Defined("123"), value = OptionalInput.Undefined)
println("not specified: ${mapper.writer(filters).writeValueAsString(notSpecified)}"). // prints out: not specified: {"name":"123","value":{}}
override fun serialize(value: OptionalInput<*>, gen: JsonGenerator, serializers: SerializerProvider) {
when (value) {
is OptionalInput.Undefined -> return
is OptionalInput.Defined -> {
if (value.value == null) {
serializers.defaultNullValueSerializer.serialize(value.value, gen, serializers)
} else {
serializers.findValueSerializer(value.value::class.java).serialize(value.value, gen, serializers)
}
}
}
}
I end up with invalid { "name": "123", "value" }
val mapper = jacksonObjectMapper()
mapper.setSerializationInclusion(Include.NON_EMPTY)