3

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

我尝试了这个kludge,它可以解决问题:

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 列表,它是一个列表元素;我想要一种对于深度嵌套结构不会变得笨拙的方法。

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

4

1 回答 1

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"})
于 2013-07-31T12:06:43.760 回答