展平Scala中嵌套的Json对象列表

时间:2017-05-10 20:57:36

标签: json scala playframework

我有一个以这种形式的Json对象列表:

[{'a': JsonObj()}, {'b':JsonObj()}, .... ]

如何将列表展平为此表单:

{'a': JsonObj(), 'b': JsonObj(), ...}

注意每个字段都有一个嵌套的JsonObj作为其值。我不想弄平那些json对象。

我想把它附加到一个空的JsonObj中但是没有用。

val rStreetsJsonObj: JsObject = Json.obj()
for (routeS <- jsonList) {
      rStreetsJsonObj.+(routeS) // Gives error: expected arguments should be of the form (String, jsValue) not JsObject

}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

list.foldLeft(Json.obj())(_ deepMerge _)

这很有效。

这个答案来自@cchantep对原帖的评论。

答案 1 :(得分:0)

您可以尝试使用此解决方案:

首先:您需要将收到的字符串转换为实际 JsArray

代码可能是:

val jsArray = Json.parse("[{\"a\": 1}, {\"b\":1}]").asInstanceOf[JsArray]

注意返回JsValue类型的parse方法,实际上它是scala特征,特定工具案例类都扩展它,例如JsArray

第二:您可以迭代JsArray类型,但请记住它没有直接支持foreach方法

但作为案例类,您可以访问value method

总之,完全解决方案,你可以尝试一下:

object Test {
  def main(args: Array[String]): Unit = {
    val jsArray = Json.parse("[{\"a\": 1}, {\"b\":1}]").asInstanceOf[JsArray]
    var rStreetsJsonObj: JsObject = Json.obj()

    for (i <- jsArray.value) {
      val tmpObject = i.asInstanceOf[JsObject]
      rStreetsJsonObj = rStreetsJsonObj.++(tmpObject)
    }
    println(rStreetsJsonObj)
  }
}

会打印结果{"a":1,"b":1}