Я использую json4s для работы с объектами JSON в моем коде Scala. Я хочу преобразовать данные JSON во внутреннее представление. Следующий обучающий тест иллюстрирует мою проблему:
"Polimorphic deserailization" should "be possible" in {
import org.json4s.jackson.Serialization.write
val json =
"""
|{"animals": [{
| "name": "Pluto"
| }]
|}
""".stripMargin
implicit val format = Serialization.formats(ShortTypeHints(List(classOf[Dog], classOf[Bird])))
val animals = parse(json) \ "animals"
val ser = write(Animals(Dog("pluto") :: Bird(canFly = true) :: Nil))
System.out.println(ser)
// animals.extract[Animal] shouldBe Dog("Pluto") // Does not deserialize, because Animal cannot be constructed
}
Предположим, что есть объект JSON, который имеет список Животные. Animal
является абстрактным типом и, следовательно, не может быть инстанцирован. Вместо этого я хочу проанализировать структуру JSON для возврата объектов Dog
или Bird
. У них есть другая подпись:
case class Dog(name: String) extends Animal
case class Bird(canFly: Boolean) extends Animal
Поскольку их подпись различна, их можно идентифицировать без наличия тега класса в объекте JSON. (Точнее, структура JSON, которую я получаю, не предоставляет эти теги).
Я попытался сериализовать список объектов Animal (см. код). Результат: Ser: {"animals":[{"jsonClass":"Dog","name":"pluto"},{"jsonClass":"Bird","canFly":true}]}
Как вы можете видеть, при сериализации json4s добавляет тег class jsonClass
.
Как я могу десериализовать объект JSON, который не предоставляет такой тег? Можно ли достичь этого, расширив TypeHints
?
Я также нашел аналогичный вопрос: [json4s]: Извлечение массива разных объектов с помощью решения, которое каким-то образом использует generics вместо подкласса. Однако, если я правильно понимаю, это решение не позволяет просто передать объект json и иметь внутреннее представление. Вместо этого мне нужно будет выбрать форму, которая не является None
(при проверке всех возможных типов в наследовании hiearchy. Это немного утомительно, так как у меня есть несколько полиморфных классов на разных глубинах в структуре JSON.