2013-03-01 99 views
3

這裏是一個JSON列表我要處理:JSON解析與播放:爲什麼是這樣解析列表?

scala> jsonStructure \ "response" \ "docs" 
res4: play.api.libs.json.JsValue = [{"title":"the very first document"},{"title":"on brick walls"}] 

我試圖將其轉換爲一個列表,但我得到不同的語義的東西,一個列表,它的唯一元素是列表:

scala> jsonStructure \ "response" \\ "docs" 
res3: Seq[play.api.libs.json.JsValue] = List([{"title":"the very first document"},{"title":"on brick walls"}]) 

scala> res3.size 
res4: Int = 1 

我想這雜牌,這是卓有成效的:

scala> (jsonStructure \ "response" \ "docs").as[Seq[play.api.libs.json.JsValue]] 
res9: Seq[play.api.libs.json.JsValue] = List({"title":"the very first document"}, {"title":"on brick walls"}) 

scala> res9 size 
res10: Int = 2 

爲什麼d ID \\不工作?將JsValue理解爲JsArray的習慣用法是什麼?雖然仍然保持「導航使用和從未失敗」的哲學?我想分析更深的結構,比如obj中的obj列表,它是一個列表元素;我想要一種不會因深度嵌套結構而變得笨重的方法。

隨意,如果你發現它的複雜改正我的做法,脆等

回答

0

如果你想只是標題的項目列表,你可能會想要寫的東西,如:

json \\ "title" 

哪返回:

List("the very first document", "on brick walls") 

\\作品,列出你的路徑選擇匹配的任何元素(在目前的水平,所有的後代)。由於基本上有一個docs元素,它將返回一個包含一個元素的列表。只有當您要求標題時,纔會返回標題列表。

但是從你接近,你可能想在JsArray到圖案匹配JsValue:

def convert(json : JsValue) : Option[Seq[JsValue]] = json match { 
    case JsArray(arr) => Some(arr) 
    case _ => None 
    } 

它返回你想要什麼:

List({"title":"the very first document"}, {"title":"on brick walls"})