我有一张Map,看起来像这样:
public class VerbResult {
@JsonProperty("similarVerbs")
private Map<Verb, List<Verb>> similarVerbs;
}
我的动词类看起来像这样:
public class Verb extends Word {
@JsonCreator
public Verb(@JsonProperty("start") int start, @JsonProperty("length") int length,
@JsonProperty("type") String type, @JsonProperty("value") VerbInfo value) {
super(length, length, type, value);
}
//...
}
我想序列化和反序列化VerbResult类的示例,但是当我这样做时,我得到以下错误:Can not find a (Map) Key deserializer for type [simple type, class my.package.Verb]
我在网上看到你需要告诉Jackson如何反序列化map键,但是我没有找到任何解释如何去做的信息。动词类也需要在map之外被序列化和反序列化,所以任何解决方案都应该保留这个功能。
谢谢你的帮助。
5条答案
按热度按时间ejk8hzay1#
经过 一 天 的 搜索 , 我 找到 了 一 种 基于 this question 的 更 简单 的 方法 , 解决 方案 是 将
@JsonDeserialize(keyUsing = YourCustomDeserializer.class)
注解 添加 到 Map 中 , 然后 通过 扩展KeyDeserializer
实现 自 定义 反 序列 化 器 , 并 重写deserializeKey
方法 , 该 方法 将 使用 字符 串 键 调用 , 您 可以 使用 该 字符 串 构建 真正 的 对象 ,或者 甚至 从 数据 库 中 取出 现有 的 一 个 。所以 首先 在 Map 上 声明 :
中 的 每 一 个
然后 创建 将 使用 字符 串 键 调用 的 反 序列 化 程序 。
格式
适用 于 Jersey 和 Jackson 2.x
zzzyeukh2#
如上所述,技巧是需要一个key反序列化器(这也让我感到困惑)。在我的例子中,在我的类上配置了一个非StringMap键,但它不在我正在解析的JSON中,所以一个非常简单的解决方案对我来说是有效的(只需在键反序列化器中返回null)。
sgtfey8w3#
构建在answer given here上,它建议使用反序列化程序实现一个模块。JodaTime Module是一个包含序列化程序和反序列化程序的模块的完整示例,易于理解。
请注意,模块功能是在Jackson1.7版中引入的,因此您可能需要升级。
所以一步一步:
1.根据Joda示例为类创建一个包含序列化程序(反序列化程序)的模块
1.使用
mapper.registerModule(module);
注册模块然后你就可以
soat7uwm4#
在浏览了网络之后,我想我有一个关于如何处理POJO风格的键的不错的解决方案(尽管,一如既往,最好不要使用完整的对象作为Map键)。
串行器(注册为Jackson模块,位于Sping Boot 内部):
(note在标准Java环境中,您必须在此处示例化您自己的
objectMapper
示例)解串器:
gz5pxeao5#
假设我们有一个Map属性,如下所示:
我们将MyObjectKey序列化为json字符串,调用objectMapper.writeAsString;并从json字符串反序列化到MyObjectKey