gpt4 book ai didi

json - 如何使用 JsPath 遍历 JSON 对象字段?

转载 作者:行者123 更新时间:2023-12-04 20:07:10 31 4
gpt4 key购买 nike

考虑供应商 API 提供的以下 JSON:

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._

val json = Json.parse(
"""
|{
| "returns": {
| "markets" : {
| "ABC" : {
| "label": "ABC",
| "id":1
| },
| "DEF" : {
| "label": "DEF",
| "id":2
| }
| }
| }
|}
""".stripMargin)

如何提取与“label”和“id”字段相关的一系列对。
从这段 JSON 中,我期望的结果是:
Seq((1,"ABC"),(2,"DEF"))

我无法构建正确的 JsPath 提取器,因为它需要一个匹配项,例如
val jsonTransformer = (__ \ 'returns \ 'markets).json.pick
json.transform(jsonTransformer)

最佳答案

下面是我如何用漂亮的可组合部分构建这个解析器。首先是用于丢弃键的通用对象到数组转换器:

val objToArray: Reads[JsArray] =
JsPath.json.pickBranch.map(obj => JsArray(obj.fields.map(_._2)))

现在为一个 Reads可以处理市场对象:
val marketReads: Reads[(Int, String)] =
((__ \ 'id).read[Int] and (__ \ 'label).read[String]).tupled

现在我们把它们联系在一起:
val pairsReads: Reads[List[(Int, String)]] = 
(__ \ 'returns \ 'markets).read(objToArray) andThen list(marketReads)

最后:
scala> json.validate(pairsReads).foreach(println)
List((1,ABC), (2,DEF))

这就是你想要的。请注意,为了清楚起见,我在上面指定了类型,但这里没有必要——我可能会在实际代码中将它们排除在外,因为这些部分非常小而简单。

关于json - 如何使用 JsPath 遍历 JSON 对象字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24345818/

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