java - 在 Jackson(和 MrBean)的反序列化时使用多态性

标签 java json polymorphism jackson deserialization

我正在使用 Jackson 将一些 JSON 反序列化为 Java POJO。我用我的对象映射器注册了 MrBean 模块,所以我所要做的就是定义一堆接口(interface),POJO 是基于这些接口(interface)自动生成的。

我想要一个 Credentials 接口(interface),其中包含扩展它的各种类型的凭证,例如UsernamePasswordCredentials 和 CertificateFileCredentials。

在没有任何注释或其他咒语的情况下执行此操作以尝试使其工作会在我的单元测试中出现以下错误:

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "username" (Class org.codehaus.jackson.generated.SCRUBBED.Credentials), not marked as ignorable
 at [Source: java.io.StringReader@e0b6f5; line: 32, column: 29] (through reference chain: HostConfiguration["hostDefinitions"]->HostDefinition["credentials"]->Credentials["username"])

我也followed the instructions at another StackOverflow post ,我遇到了同样的错误。

这个错误是有道理的; Jackson 试图将我的 JSON 文件的内容映射到一个空接口(interface)。但是,我(也许天真地)希望 Jackson 寻找扩展基本 Credentials 接口(interface)的接口(interface),并尝试将这些接口(interface)中的字段与它在 JSON 对象中找到的字段相匹配。

我在 Jackson wiki 上看到了一些使用 JSON 对象中的元信息的示例,例如用 "@class":"foo.bar.CertificateFileCredentials" 装饰一个对象,但我宁愿避免任何这种情况,因为我的 JSON 输入将由其他服务自动生成,而那些其他服务不必了解我的服务的内部结构。

谢谢!

最佳答案

您将如何定义实际的实现类?作为附加接口(interface)?那些应该正确生成;但问题是在反序列化过程中:如果有多种选择,反序列化器必须有某种方法来找出要使用的实际类型。 为此,如您所见,建议使用 @JsonTypeInfo

关于java - 在 Jackson(和 MrBean)的反序列化时使用多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541209/

相关文章:

java - 如何在 Java 中调用给定特定参数类的不同方法

java - 使用 JdbcTemplate 在 Spring Boot 中耗尽连接池

Java:使用多个线程同时在 JPanel 上绘制

python - 将字符串键转换为字典中的 int

javascript - 使用 Jquery 或 Javascript 解析嵌套的 Yodlee JSON feed

C# 在基类中创建派生类的实例

c++ 将 vector<Inherited*> 转换为 vector<abstract*>

java - 无法读取 HTTP 消息。缺少必需的请求正文

java - Android 2.1 SDK + ConcurrentHashMap$ValueIterator 与 GC

c# - 从 JSON 数组中提取头发颜色