使用 Jackson 反序列化非字符串映射键

新手上路,请多包涵

我有一个看起来像这样的地图:

 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 如何反序列化映射键,但我没有找到任何信息来解释如何去做这件事。 verb 类也需要在映射之外进行序列化和反序列化,因此任何解决方案都应保留此功能。

谢谢您的帮助。

原文由 Max 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

基于 此处给出的答案,建议使用反序列化器实现模块。 JodaTime 模块 是一个易于理解的包含序列化器和反序列化器的模块的完整示例。

请注意,模块功能是在 Jackson 1.7 版中引入的,因此您可能需要升级。

所以一步一步:

  1. 根据 Joda 示例为您的类创建一个包含(反)序列化器的模块
  2. 注册该模块 mapper.registerModule(module);

一切就绪

原文由 fvu 发布,翻译遵循 CC BY-SA 3.0 许可协议

经过一天的搜索,我发现了一种基于 这个问题 的更简单的方法。解决方案是向地图添加 @JsonDeserialize(keyUsing = YourCustomDeserializer.class) 注释。然后通过扩展 KeyDeserializer 并覆盖 deserializeKey 方法来实现自定义解串器。该方法将使用字符串键调用,您可以使用该字符串构建真实对象,甚至可以从数据库中获取现有对象。

所以首先在地图声明中:

 @JsonDeserialize(keyUsing = MyCustomDeserializer.class)
private Map<Verb, List<Verb>> similarVerbs;

然后创建将使用字符串键调用的反序列化器。

 public class MyCustomDeserializer extends KeyDeserializer {
    @Override
    public MyMapKey deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        //Use the string key here to return a real map key object
        return mapKey;
    }
}

适用于 Jersey 和 Jackson 2.x

原文由 Japheth Ongeri - inkalimeva 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题