当前位置: 首页 > 知识库问答 >
问题:

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

贺飞
2023-03-14
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类的实例,但是当我这样做时,我得到了这个错误:不能找到类型[simple type,class my.Package.Verb]的(映射)键反序列化器

我在网上读到,你需要告诉杰克逊如何反序列化地图键,但我没有找到任何信息解释如何去做这件事。verb类也需要在映射之外进行序列化和反序列化,因此任何解决方案都应该保留此功能。

共有1个答案

乐正浩博
2023-03-14

在浏览了web之后,我想我有了一个处理POJO风格的键的不错的解决方案(尽管一如既往,您最好不要使用完整的对象作为地图键)。

序列化程序(注册为Jackson模块,位于Spring Boot内部):

@Bean
fun addKeySerializer(): Module =
    SimpleModule().addKeySerializer(YourClass::class.java, YourClassSerializer())

class YourClassSerializer() : JsonSerializer<YourClass>() {
    override fun serialize(value: DataElement, gen: JsonGenerator, serializers: SerializerProvider) {
        gen.writeFieldName(jacksonObjectMapper().writeValueAsString(value))
    }
}

(注意,在标准Java环境中,您必须在这里实例化自己的ObjectMapper实例)

@Bean
fun addKeyDeserializer(): Module =
    SimpleModule().addKeyDeserializer(YourClass::class.java, YourClassDeserializer())

class YourClassDeserializer() : KeyDeserializer() {
    override fun deserializeKey(key: String, ctxt: DeserializationContext): YourClass? {
        return ctxt.parser.readValueAs(YourClass::class.java)
    }
}
 类似资料:
  • 问题内容: 我有一张看起来像这样的地图: 我的动词类如下: 我想序列化和反序列化我的VerbResult类的实例,但是当我这样做时,出现此错误: 我在网上阅读了您需要告诉杰克逊如何反序列化地图键的信息,但是我没有找到任何信息来解释如何进行此操作。动词类也需要在映射之外进行序列化和反序列化,因此任何解决方案都应保留此功能。 问题答案: 在此处给出的答案的基础上,建议使用反序列化器实现模块。所述Jod

  • 我对Jackson有一个错误的理解,就是将json文件反序列化为poco。这是我的代码: 我的POCO命名为AnimalBean: }还有我的JSON文件: } 当我执行我的代码时,我有以下错误:未识别的字段“动物园”(类动画豆),未标记为可忽略的。我知道问题是我的json文件开始不直接由动物,但我不能改变它,因为它不是我的。我已经尝试把对象apper.configure(Deseriazatio

  • 可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)

  • 我想反序列化以下XML(缩短示例): 到目前为止,我想出的代码: 但这种方法存在几个问题: > @JacksonXmlProperty t(localName="subject")始终为空,因为我将其用于类型信息。为什么?,或者如何绕过它? 还是这种方法已经错了? 最后是我使用的周围类:

  • 我正在尝试使用Jackson将反序列化为,但它不起作用。 我有一个带有LocalDateTime字段的数据类: 我添加了特殊的Jackson数据类型模块: 序列化可以在以下情况下正常工作: 结果字符串: 但反序列化不适用于: 作为错误,我得到: 我错过了什么?我对串行化有效而反序列化无效感到困惑。 MWE:(小格拉德尔Java项目) Main.java: build.gradle: