Java 如何让jackson找到我的密钥反序列化器?
这是我的类(省略了getter和setter):Java 如何让jackson找到我的密钥反序列化器?,java,jackson,Java,Jackson,这是我的类(省略了getter和setter): 带有AMAP的公共类{ @JsonProperty(“地图”) @JsonDeserialize(keyUsing=RangeDeserializer.class) 私人地图; @JsonCreator 公共类WitAMAP(地图){ this.map=map; } } RangeSerializer如下所示: public class RangeDeserializer extends KeyDeserializer { publi
带有AMAP的公共类{
@JsonProperty(“地图”)
@JsonDeserialize(keyUsing=RangeDeserializer.class)
私人地图;
@JsonCreator
公共类WitAMAP(地图){
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;
}
}
公共类RangeDeserializer扩展了KeyDeserializer{
公共对象映射器对象映射器(){
返回新的ObjectMapper()
.注册模块(
新的JavaTimeModule(),
新的Jdk8Module(),
新的GuavaModule(),
新参数NamesModule());
}
@凌驾
公共范围反序列化键(字符串键、反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
TypeReference typeRef=新的TypeReference(){
};
Range=objectMapper().readValue(键,typeRef);
返回范围;
}
}
使用这些的主要代码是:
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);
Map Map=newhashmap();
Range key=Range.greaterThan(Instant.now());
map.put(key,“some value”);
ClassWithAMap ClassWithAMap=新类WITHAMAP(地图);
字符串jsonInput=objectMapper()
.writerWithDefaultPrettyPrinter()
.writeValueAsString(带有AMAP的类);
classWithMap classWithMap=objectMapper()
.readValue(jsonInput,
类与映射类);
上一条语句给出了以下错误:
InvalidDefinitionException: Cannot find a (Map) Key deserializer for type [simple type, class com.google.common.collect.Range<java.time.Instant>]
InvalidDefinitionException:找不到类型[简单类型,类com.google.common.collect.Range]的(映射)键反序列化器
当然,它从不调用我的反序列化程序。我错过了注册反序列化程序的一些步骤,尽管我将其与使用自定义类而不是Range
的类似设置进行了比较,但是效果很好,我看不出有什么区别。有人知道我做错了什么吗?我猜这和通用型有关,但我没有进一步的说明
我正在使用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;
}
}
用AMAP分类{
私人地图;
@JsonCreator
使用AMAP的公共类(
@JsonProperty(“地图”)
@JsonDeserialize(keyUsing=RangeDeserializer.class)
(地图){
this.map=map;
}
}
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;
}
}