这是我要处理的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列表,它是一个列表元素;我想要一种对于深层嵌套结构不会变得笨重的方法。
如果您发现它复杂,脆弱等,请随意纠正我的方法。
答案 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"})