这可能很简单,我的困难很可能是因为我对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.
任何人都可以指出我正确的方向吗?
提前致谢!
答案 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))