gpt4 book ai didi

java - 告诉 Jackson 关于 @JsonSerialize(contentUsing=...) 的新类型 "content"

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:30 38 4
gpt4 key购买 nike

我正在使用定义 Option 类的第三方库,该类类似于 java.util.Optional。在一种情况下,它包含需要自定义反序列化器的类型。使用Optional,我可以写

class StdContainer {
@JsonDeserialize(contentUsing=MyDeserializer.class)
@JsonSerialize(contentUsing=MySerializer.class)
Optional<MyClass> content;
}

jackson 将在类里面使用我的自定义序列化器/反序列化器。

使用第三方库,我尝试编写

class ThirdPartyContainer {
@JsonDeserialize(contentUsing=MyDeserializer.class)
@JsonSerialize(contentUsing=MySerializer.class)
Option<MyClass> content;
}

这使用默认序列化器序列化 MyClass,这是有道理的,因为我不希望 Jackson 了解第三方库。有没有办法告诉 Jackson 某个特定的类是一个容器,并且应该在该类上使用 contentUsing ?我希望这还涉及告诉 jackson 如何获取内容。

最佳答案

Optional(来自 Guava、Java 8、Scala)被识别为容器的方式是通过它们注册 TypeModifier:这使得 Jackson 认为它们有些特殊(实际类型是 ReferenceType)。要了解它们是如何工作的,您可以查看 jackson-datatype-guava。一旦类型被完善,实际的序列化器/反序列化器实现就非常简单:jackson-databind 具有提供大约 90% 处理的基本实现(例如,请参阅 jackson-databind 中的 AtomicReferenceSerializerAtomicReferenceDeserializer)。

像这样的用例实际上是添加 Jackson 模块接口(interface)的重要原因,以允许为第 3 方类型开发和共享数据类型模块,以便一旦数据类型库(或社区)的维护者提供此类模块,其他用户只需将其插入即可“正常工作”

关于java - 告诉 Jackson 关于 @JsonSerialize(contentUsing=...) 的新类型 "content",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541760/

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