2012-01-05 120 views
1

這可能是一件容易的事情,而我的困難很可能是由於我對Scala的新穎性(它已經很快成爲我最喜歡的語言)所致。從Scala中使用lift-json解析JSON呈現JSON

基本上我有一些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] 
} 

我試過渲染(米)和各種其他半隨機的東西來嘗試並得到它的工作,但迄今沒有骰子。最近我來給我這個錯誤:

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

任何人都可以請指點我在正確的方向嗎?

在此先感謝!

回答

3

我認爲處理這個問題的最簡單方法是爲一個包創建一個case類。然後,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 2012-01-05 08:10:13

+0

是重新呈現的JSON進入數據庫,還是你需要它解析爲scala列表和映射到數據庫?如果您實際上不需要列表/地圖,則可以繞過整個過程並直接使用JValues。 – 2012-01-05 16:30:19

+0

最後,我只是用它「按原樣」,但很遺憾,訪問數據是非常fiddly :) – PeterM 2012-01-06 08:58:11

1

如果消息可以是任何數據,您可以將這些數據提取爲JValues。

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

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