使用此数据模型...
TestClass.kt
data class TestClass (val bar: Optional<Double>?)
我的目标是反序列化以下json值:
{"foo": 3.5} --> foo = 3.5
{"foo": null} --> foo = Optional.empty() // This is currently my problem. foo is null and I can't seem to fix it
{} --> foo = null
我看过solution here并尝试了此操作,但是我的“反序列化”方法中的断点似乎从未命中。
OptionalDeserializer.java
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import java.io.IOException;
import java.util.Optional;
public class OptionalDeserializer extends JsonDeserializer<Optional<?>> implements ContextualDeserializer {
private JavaType valueType;
@Override
public JsonDeserializer<?> createContextual(DeserializationContext context, BeanProperty property) {
this.valueType = property.getType().containedType(0);
return this;
}
@Override
public Optional<?> deserialize(final JsonParser parser, final DeserializationContext context) throws IOException {
final JsonNode node = parser.getCodec().readTree(parser);
return node.isNull()
? Optional.empty()
: Optional.of(context.readValue(parser, valueType));
}
}
TestDeserialization.kt
fun main(): {
val objectMapper = ObjectMapper().registerModule(KotlinModule())
val module = SimpleModule()
module.addDeserializer(Optional::class.java, OptionalDeserializer())
objectMapper.registerModule(module)
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)
objectMapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true)
objectMapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true)
objectMapper.nodeFactory = JsonNodeFactory.withExactBigDecimals(true)
val inputJson = """{"foo" : null}"""
val expectedObject = TestClass(foo = Optional.empty())
val actualObject = objectMapper.readValue(inputJson, TestClassBravo::class.java)
assertEquals(expectedObject, actualObject)
}
build.gradle(用于版本信息)
compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.9.8'
有两种处理方法。
不使用自定义序列化程序,而是依靠杰克逊默认值Jdk8Module
(请参阅here)]] >>
如果您想要自定义解串器,则需要指定空访问模式,否则将不会为null
值调用解串器:
代码2:
// In OptionalDeserializer
@Override
public AccessPattern getNullAccessPattern() {
return AccessPattern.CONSTANT;
}