2013-03-01 83 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"})