使用Play进行JSON解析:为什么要以这种方式解析列表?

时间:2013-03-01 19:27:05

标签: json scala playframework playframework-2.0

这是我要处理的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

为什么\\不起作用?将JsValue理解为JsArray的惯用方法是什么?在保持“导航使用和\永不失败”的理念的同时?我想解析更深层的结构,比如obj里面的一个obj列表,它是一个列表元素;我想要一种对于深层嵌套结构不会变得笨重的方法。

如果您发现它复杂,脆弱等,请随意纠正我的方法。

1 个答案:

答案 0 :(得分: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"})