【问题标题】:Jackson deserialization to concrete polymorphic classJackson 反序列化为具体的多态类
【发布时间】:2020-06-01 14:52:52
【问题描述】:

我关注 Jackson 注释类 (Kotlin)

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type"
)
@JsonSubTypes(
    value = [
        JsonSubTypes.Type(value = Child1::class, name = "child1"),
        JsonSubTypes.Type(value = Child2::class, name = "child2")
    ]
)
sealed class Parent 

class Child1: Parent()
class Child2: Parent()

我尝试反序列化不包含 type 属性的 JSON,但我提供了具体的类,所以这无关紧要

// Kotlin extension method provides type in runtime
mapper.readValue<Child1>(json)

我还是得到了Missing type id when trying to resolve subtype of ...。有没有办法告诉 Jackson 使用反序列化中提供的类型,而不是尝试从 type 属性中找到它?

【问题讨论】:

标签: java jackson polymorphism


【解决方案1】:

default implementation class to use for deserialization 通过defaultImpl

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = Child1.class)

来自 Javadoc:

可用于指定默认实现的可选属性 如果类型标识符不是,则用于反序列化的类 存在,或者不能映射到已注册的类型(可能发生 对于 ids,但在指定要使用的显式类时除外)。物业有 对用于序列化的类型 id 的选择没有影响;它只被使用 在决定如何处理其他无法映射的情况。

【讨论】:

  • 谢谢,这解决了部分问题,如果我想反序列化两个 Childs 怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2023-03-18
  • 2016-04-25
相关资源
最近更新 更多