У меня есть иерархия типов для грамматики выражений аналогично следующему (для краткости использую классы данных 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 для этой грамматики уже была определена, и я хотел бы использовать Джексона для ее чтения и записи.Большинство типов имеют помеченное, полиморфное представление, однако Pi
следует сериализовать в виде буквенной строки "pi"
, а литералы следует сериализовать в виде двойных значений. Например,
Plus(Literal(2.5), Multiply(Literal(1.0), Pi))
следует сохранить как
{
"op": "+",
"left": 2.5,
"right": {
"op": "*",
"left": 1.0,
"right": "pi"
}
}
Как видите, большинство классов используют обычную полиморфную сериализацию с "op"
в качестве тега типа, но есть некоторые исключения для Literal
и Pi
.
Есть ли способ настроить Джексона для этого сценария сериализации? Я бы хотел как можно больше полагаться на сериализацию bean-компонентов по умолчанию (нет ручного разбора буфера токенов для случаев Plus
и Multiply
), потому чтов действительности существует гораздо большее число классов, которые должны быть сериализованы таким образом.