不仅在JSON中具有对象的Jackson多态(反)序列化

时间:2018-09-27 12:05:33

标签: java json jackson

我有一个类似于 expressions语法的类型层次结构(为简洁起见,使用Kotlin数据类,但我也同意Java解决方案):

sealed class Expression
object Pi : Expression()
data class Literal(val value: Double) : Expression()
data class Plus(val left: Expression, val right: Expression) : Expression()
data class Multiply(val left: Expression, val right: Expression) : Expression()

已经定义了此语法的JSON序列化,我想使用Jackson进行读写。大多数类型都有带标签的多态表示形式,但是,Pi应该序列化为文字字符串"pi",而文本应该序列化为双精度值,例如,

Plus(Literal(2.5), Multiply(Literal(1.0), Pi))

应另存为

{
  "op": "+",
  "left": 2.5,
  "right": {
    "op": "*",
    "left": 1.0,
    "right": "pi"
  }
}

如您所见,大多数类使用普通的多态序列化并将"op"作为类型标记,但是LiteralPi例外。

有什么方法可以针对这种序列化方案配置Jackson吗?我想尽可能地依赖默认的bean序列化(PlusMultiply个案例),因为实际上,应该以这种方式序列化更多的类。

0 个答案:

没有答案