/ / JSONをScalaのlift-jsonを使用して解析したJSONから解析する - 解析、スケーラ、レンダリング、lift-json

Scalaのlift-jsonを使用して解析されたJSONからJSONをレンダリングする - 解析、スケーラ、レンダリング、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))

しかし、私がループでしたいのは、各マップをとり、それをJSONに戻すことです。

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

私はレンダリング(m)やその他のセミランダムなものを試してみましたが、これまでのところサイコロはありませんでした。

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

誰でも正しい方向に向けることができますか?

前もって感謝します!

回答:

回答№1の場合は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]}

回答№2の場合は1

メッセージに任意のデータを指定できる場合は、それらをJValuesとして抽出できます。

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

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