Объединить вложенный JSON с помощью Play Scala - PullRequest
0 голосов
/ 15 мая 2018

У меня есть два объекта JSON (с одинаковой структурой):

Первый -

json1 = {a: {b: [{c: "x" , d: val1}, {c: "y" , d: val2}]} }

, а второй -

json2 = {a: {b: [{c: "x" , d: val3}, {c: "y" , d: val4}]} }

.способ объединения этих двух объектов в один объект (если значение c одинаково, то сумма значений d):

result = {a: { b: [{c: "x", d: (val1+val3) } , {c: "y", d: (val2+val4) }] } }

, если

   json2 = {a: {b: [{c: "y" , d: val3}, {c: "z" , d: val4}]} }
    result = {a: { b: [{c: "x" , d: val1} , {c: "y", d: (val2+val4+val3)},{c: "z" , d: val4}] } }

Есть ли какой-либо встроенный метод для этоготрюк.Спасибо.

1 Ответ

0 голосов
/ 15 мая 2018

Если вы знаете свою структуру JSON, один из способов сделать это - превратить их в классы дел и сравнить их.Вот способ, который я нашел (который ни в коем случае не оптимизирован):

//Going by your JSON structure of {"a": {"b": [{"c": String , "d": Int}]}}

import play.api.libs.json.{Json, OFormat}

case class A(a: B)
object A{implicit val format: OFormat[A] = Json.format[A]}

case class B(b: Seq[C])
object B{implicit val format: OFormat[B] = Json.format[B]}

case class C(c: Option[String], d: Option[Int])
object C{implicit val format: OFormat[C] = Json.format[C]}

val json1 = Json.parse("""{"a": {"b": [{"c": "x" , "d": 1}, {"c": "y" , "d": 2}]}}""").as[A]
val json2 = Json.parse("""{"a": {"b": [{"c": "x" , "d": 3}, {"c": "y" , "d": 4}]}}""").as[A]

val cSeq: Seq[C] = {
  (json1.a.b zip json2.a.b) map {
  // List((C(Some(x),Some(1)),C(Some(x),Some(3))), (C(Some(y),Some(2)),C(Some(y),Some(4))))
    c =>
      val (c1, c2) = c
      // assign a value to each element of the pairs

      val BLANK_C = C(None, None)

      if (c1.c.get == c2.c.get) C(c1.c, Some(c1.d.get + c2.d.get)) else BLANK_C
      // if the "c" keys match, add the "d" keys. If not, return an empty C model
      // will need to handle if get fails (ie None instead of Some(whatever))
  }
}

val json3 = Json.toJson(A(B(cSeq)))

println(json3)
// {"a":{"b":[{"c":"x","d":4},{"c":"y","d":6}]}}

В настоящее время, если части не совпадают, возвращается пустой объект.Вы не указали, что должно произойти, когда они не совпадают, поэтому я оставлю это на ваше усмотрение, чтобы разобраться.

...