1

这可能是一个简单的问题,而我的困难可能是由于我对 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]
}

我已经尝试了 render(m) 和其他各种半随机的东西来尝试让它工作,但到目前为止还没有骰子。我最接近的给了我这个错误:

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

谁能指出我正确的方向?

提前致谢!

4

2 回答 2

3

我认为处理这个问题的最简单方法是为包创建一个案例类。Lift-json 可以很好地将数据提取到实例中。然后,您可以循环它们并通过创建 2 元组将它们隐式地转回 JObjects。

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]}
于 2012-01-05T05:41:06.480 回答
1

如果消息可以是任何数据,您可以将它们提取为 JValue。

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

val parsedJSON = parse(...)
val bundles = (parsedJSON \\ "bundle").extract[List[JValue]]
compact(render(bundles))
于 2012-01-06T06:50:42.497 回答