json4s: извлечение поперечного поля - PullRequest
0 голосов
/ 10 октября 2018

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?

1 Ответ

0 голосов
/ 10 октября 2018

В общем случае лучше всего анализировать данные как есть, а затем обрабатывать их (чтобы сохранить разделение интересов ).

В этом случае это выглядит так:

val a = parse("""{"a": 1, "b": 2}""").extract[A] // A(1,2)

a.copy(b = a.a + a.b) // A(1,3)

В более сложных случаях компоновка обработанных данных будет отличаться от проанализированных данных, поэтому вам потребуется секунда case class, которая описывает необработанные данные и функцию для преобразования их в обработанный формат.Хотя это может показаться громоздким, это облегчит понимание кода и сделает его более доступным для модификации.

...