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())
)
Они могли быть обработаныDefaultFormats
или другие CustomSerializer
, если мы не хотим иметь «перекрестное извлечение поля» для поля b
.Ситуация ухудшается, если класс case на самом деле большой.
Есть ли способ написать правило только для специальных полей, а остальное оставить обработанным DefaultFormats
или CustomSerialzer
?