gpt4 book ai didi

java - 如何让 Jackson 找到我的 key 解串器?

转载 作者:行者123 更新时间:2023-11-30 05:21:59 25 4
gpt4 key购买 nike

这是我的类(省略 getter 和 setter):

public class ClassWithAMap {

@JsonProperty("map")
@JsonDeserialize(keyUsing = RangeDeserializer.class)
private Map<Range<Instant>, String> map;

@JsonCreator
public ClassWithAMap(Map<Range<Instant>, String> map) {
this.map = map;
}

}

RangeSerializer 看起来像这样:

public class RangeDeserializer extends KeyDeserializer {

public ObjectMapper objectMapper() {
return new ObjectMapper()
.registerModules(
new JavaTimeModule(),
new Jdk8Module(),
new GuavaModule(),
new ParameterNamesModule());
}

@Override
public Range<Instant> deserializeKey(String key, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
TypeReference<Range<Instant>> typeRef = new TypeReference<Range<Instant>>() {
};
Range<Instant> range = objectMapper().readValue(key, typeRef);
return range;
}
}

使用这些的主要代码是这样的:

        Map<Range<Instant>,String> map = new HashMap<>();
Range<Instant> key = Range.greaterThan(Instant.now());
map.put(key, "some value");
ClassWithAMap classWithAMap = new ClassWithAMap(map);

String jsonInput = objectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(classWithAMap);

ClassWithAMap classWithMap = objectMapper()
.readValue(jsonInput,
ClassWithAMap.class);

最后一条语句给了我这个错误:

InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.common.collect.Range<java.time.Instant>]

而且,果然,它永远不会调用我的解串器。我错过了注册解串器的一些步骤,尽管我将其与具有自定义类而不是 Range<Instant> 的类似设置进行了比较。效果很好,我看不出有什么区别。有人知道我做错了什么吗?我猜测与通用有关,但我还没有进一步了解。

我使用的是 jackson 2.9.9 和 Java 1.8。

最佳答案

您需要将所有注释移至构造函数:

class ClassWithAMap {

private Map<Range<Instant>, String> map;

@JsonCreator
public ClassWithAMap(
@JsonProperty("map")
@JsonDeserialize(keyUsing = RangeDeserializer.class)
Map<Range<Instant>, String> map) {
this.map = map;
}
}

关于java - 如何让 Jackson 找到我的 key 解串器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59419471/

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