使用Scala中的lift-json从解析的JSON渲染JSON

时间:2012-01-05 02:37:11

标签: parsing scala render lift-json

这可能很简单,我的困难很可能是因为我对Scala的新见事(已经很快成为我最喜欢的语言)。

基本上我有一些看起来像这样的JSON:

{
"to"      : "Peter",
"from"    : "Dave",
"bundle"  : [
             {"data": [1,2,3,4,5]},
             {"data": [2,3,4,5,6]}
            ]

}

现在,我已经解析了这个JSON,我可以从头部(往返)中提取数据,并可以查看捆绑中的各个消息。目前我正在使用它:

val messages = parsedJSON \\ "bundle" \\ classOf[JObject]

for (m <- messages) println(m)

这给了我:

Map(data -> List(1, 2, 3, 4, 5))
Map(data -> List(2, 3, 4, 5, 6))

但我想在那个循环中做的是将每个Map转换回JSON,即:

{
"data": [1,2,3,4,5]
}

我尝试过渲染(m)和其他各种半随机的东西试试让它起作用,但到目前为止还没有骰子。我最近的人给了我这个错误:

No implicit view available from Any => net.liftweb.json.package.JValue.

任何人都可以指出我正确的方向吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

我认为处理此问题的最简单方法是为bundle创建一个case类。然后,Lift-json可以很好地将数据提取到实例中。然后你可以循环遍历它们并通过创建2元组隐式地将它们变回JObject。

case class Bundle(data: List[BigInt])

val bundles = (parsedJSON \\ "bundle").extract[List[Bundle]]
// List(Bundle(List(1, 2, 3, 4, 5)), Bundle(List(2, 3, 4, 5, 6)))
bundles
  .map{ bundle => ("data" -> bundle.data)}
  .foreach{ j => println(compact(render(j)))}
//{"data":[1,2,3,4,5]}
//{"data":[2,3,4,5,6]}

答案 1 :(得分:1)

如果消息可以是任何数据,则可以将其作为JValues提取。

import net.liftweb.json._
import net.liftweb.json.JsonDSL._

val parsedJSON = parse(...)
val bundles = (parsedJSON \\ "bundle").extract[List[JValue]]
compact(render(bundles))