如何使用json4s将对象序列化为AST? [英] How to serialize object to AST using json4s?
本文介绍了如何使用json4s将对象序列化为AST?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在编写一个客户序列化程序.在那个 Serializer 中,我想以某种方式说:这个东西你已经知道如何序列化了".
I am writing a Customer Serializer. In that Serializer I would like to somehow say: "and this thing you already know how to serialize".
我目前的方法是这样的:
My current approach looks like that:
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))
事情既丑陋又低效.如何解决?
That parse(write(frame))
things is both ugly and inefficient. How to fix that?
推荐答案
你可以调用 Extraction.decompose(a: Any)(implicit format: Formats): JValue
产生一个 JValue
使用运行时反射从某个值中提取.
You can call Extraction.decompose(a: Any)(implicit formats: Formats): JValue
which produces a JValue
from some value using runtime reflection.
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))
这篇关于如何使用json4s将对象序列化为AST?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文