gpt4 book ai didi

java - Jackson Kotlin/Java 中泛型类型的自定义反序列化

转载 作者:行者123 更新时间:2023-12-02 01:23:02 24 4
gpt4 key购买 nike

有了这个数据模型...

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'

最佳答案

有两种方法可以解决这个问题。

  1. 不使用自定义序列化器会更容易,而是依赖 jackson 默认的 Jdk8Module (请参阅 here )

  2. 如果您想要自定义反序列化器,则需要指定 null 访问模式,否则不会针对 null 值调用反序列化器:

2 的代码:

// In OptionalDeserializer

@Override
public AccessPattern getNullAccessPattern() {
return AccessPattern.CONSTANT;
}

关于java - Jackson Kotlin/Java 中泛型类型的自定义反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60198121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com