Вам необходимо создать собственный сериализатор для ваших типов. Примерно так:
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
внедрены во внешний объект.