Полиморфная (де) сериализация Джексона с не только объектами в JSON - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть иерархия типов для грамматики выражений аналогично следующему (для краткости использую классы данных 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), потому чтов действительности существует гораздо большее число классов, которые должны быть сериализованы таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...