Подтвердить что ты не робот

Как сериализовать объект в AST с помощью json4s?

Я пишу клиентский сериализатор. В этом Сериализаторе я хотел бы как-то сказать: "И эта вещь, которую вы уже знаете, как сериализовать".

Мой текущий подход выглядит следующим образом:

    import org.json4s.native.Serialization._
    import org.json4s.JsonDSL.WithBigDecimal._

    object WindowSerializer extends CustomSerializer[Window](format =>
      ( [omitted],
        {
          case Window(frame, size) =>

            ( "size" -> size ) ~
            ( "frame" -> parse(write(frame)) )
        }))

То, что parse(write(frame)), является одновременно уродливым и неэффективным. Как это исправить?

4b9b3361

Ответ 1

Вы можете вызвать Extraction.decompose(a: Any)(implicit formats: Formats): JValue, который создает JValue из некоторого значения, используя отражение времени выполнения.

import org.json4s._
import org.json4s.jackson.JsonMethods._
import org.json4s.JsonDSL._
import java.util.UUID

case class Thing(name: String)
case class Box(id: String, thing: Thing)

class BoxSerializer extends CustomSerializer[Box](format => ({
  case jv: JValue =>
    val id = (jv \ "id").extract[String]
    val thing = (jv \ "thing").extract[Thing]
    Box(id, thing)
}, {
  case b: Box =>
    ("token" -> UUID.randomUUID().toString()) ~
      ("id" -> box.id) ~
      ("thing" -> Extraction.decompose(box.thing))
}))

implicit val formats = DefaultFormats + new BoxSerializer

val box = Box("1000", Thing("a thing"))

// decompose the value to JSON 
val json = Extraction.decompose(box)
println(pretty(json))
//  {
//    "token" : "d9bd49dc-11b4-4380-ab10-f6df005a384c",
//    "id" : "1000",
//    "thing" : {
//      "name" : "a thing"
//    }
//  }

// and read a value of type Box back from the JSON
println(json.extract[Box])
// Box(1000,Thing(a thing))