【发布时间】:2018-10-10 04:12:03
【问题描述】:
json4s extract JsonAST 基于在 DefaultFormats 和 CustomSerializer 中定义的每种类型的规则。
有时我想进行跨域提取。例如,给定一个json字符串{"a": 1, "b": 2},我想将b的值设置为a+b。我能做到:
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.JsonAST._
case class A(a: Int, b: Int)
case object ACustomSerializer extends CustomSerializer[A](
format =>
({
case jo: JObject =>
val a = (jo \ "a").extract[Int]
val b = (jo \ "b").extract[Int] + a
A(a, b)
}, Map())
)
implicit val formats = DefaultFormats + ACustomSerializer
parse("""{"a": 1, "b": 2}""").extract[A] // A(1,3)
但是,如果case class A 有许多其他字段,则很难为所有字段编写规则。
case class A(a: Int, b: Int, c: Int, d: Int)
case object ACustomSerializer extends CustomSerializer[A](
format =>
({
case jo: JObject =>
val a = (jo \ "a").extract[Int]
val b = (jo \ "b").extract[Int] + a
val c = ...
val d = ...
A(a, b, c, d)
}, Map())
)
如果我们不想对字段 b 进行“跨字段提取”,它们可以由 DefaultFormats 或其他 CustomSerializer 处理。如果案例类实际上很大,情况会变得更糟。
有没有办法只为特殊字段编写规则,其余的由DefaultFormats 或CustomSerialzer 处理?
【问题讨论】: