使用play scala合并嵌套的json

时间:2018-05-15 14:35:24

标签: scala playframework play-json

我有两个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 :(得分:0)

如果您知道自己的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}]}}

目前,如果部件不匹配,则返回空对象。当你们不匹配时,你没有说明你想要发生什么,所以我会把它留给你解决。