2012-01-05 14 views
1

これはおそらく簡単なことですが、私の難しさはScalaの新機能(既に私のお気に入りの言語になっています)に起因する可能性があります。今Scalaでlift-jsonを使用してJSONを解析する

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

} 

を、私は私が(にしてから)ヘッダからデータを取得することができますし、目を通すことができますポイントにこのJSONを解析されました:

は基本的に私はこのようになりますいくつかの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. 

誰かが正しい方向に向いていますか?

ありがとうございます!

答えて

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]} 
+0

残念ながら、バンドル内の個々のメッセージの内容は、任意の有効なJSONとすることができ、私は事前に何を知ることができません。現時点では、各メッセージのデータをデータベースに保存する必要がありますが、簡単に行うには、メッセージを単純なScala(つまりマップとリスト)として取得して、データベースに格納して格納できるようにする必要があります... – PeterM

+0

再レンダリングされたJSONはデータベースに送られますか、またはスカラーリストとマップとして解析されてデータベースに移動する必要がありますか?実際にリスト/マップが必要ない場合は、プロセス全体をバイパスしてJValuesを直接操作できます。 –

+0

私はちょうどそれをそのままの状態で使っていましたが、データにアクセスするのは面倒です:) – PeterM

1

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

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

val parsedJSON = parse(...) 
val bundles = (parsedJSON \\ "bundle").extract[List[JValue]] 
compact(render(bundles)) 
関連する問題