Как пропустить JSON-объект-обертку в Джексоне при десериализации класса case Scala? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть данные, поступающие из внешней системы в следующем формате:

{
  "type": "text",
  "data": {
    "text": "Here's some text"
  }
}

Существует много значений для type с различными полями в data, все с соответствующими классами дел вкоторые они должны быть десериализованы как часть структуры верхнего уровня, например:

case class TopLevel(parts: Part)
sealed trait Part
case class Text(text: String) extends Part
case class Image(url: String, ...) extends Part
...

Как я могу сделать это хорошим способом, не создавая обертку вокруг Part?

1 Ответ

0 голосов
/ 05 ноября 2019

Вам необходимо создать собственный сериализатор для ваших типов. Примерно так:

import org.json4s.{CustomSerializer, DefaultFormats, Extraction, JObject, JString}
import org.json4s.jackson.JsonMethods.parse
import org.json4s.jackson.Serialization

class PartSerializer extends CustomSerializer[Part](format => ( {
  case JObject(("type", JString(typeString)) :: ("data", obj) :: Nil) =>
    implicit val f = format

    typeString match {
      case "text" =>
        Extraction.extract[Text](obj)
      case "image" =>
        Extraction.extract[Image](obj)
    }
}, {
  case text: Text =>
    implicit val f = format

    JObject(List(
      ("type", JString("text")),
      ("data", JObject(List(
        ("text", JString(text.text))))
      ),
    ))
  case img: Image =>
    implicit val f = format

    JObject(List(
      ("type", JString("image")),
      ("data", JObject(List(
        ("url", JString(img.url))))
      ),
    ))
}
))

Затем вы можете использовать его так:

implicit val formats = DefaultFormats + new PartSerializer()

// Parse JSON
val part = Extraction.extract[Part](parse(json))
// Generate JSON
val json = Serialization.write(part)

Это также работает, если данные Part внедрены во внешний объект.

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