gpt4 book ai didi

使用 Play : why is a list being parsed this way? 解析 JSON

转载 作者:行者123 更新时间:2023-12-02 05:02:21 25 4
gpt4 key购买 nike

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

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

最佳答案

如果您只想要标题条目列表,您可能希望编写如下内容:

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"})

关于使用 Play : why is a list being parsed this way? 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15165337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com