gpt4 book ai didi

scala - Play 框架 JSON 转换器,如何使用递归路径 (jsPath)?

转载 作者:行者123 更新时间:2023-12-01 13:42:01 24 4
gpt4 key购买 nike

假设我有一个这样的 JSON:

{
"name" : "Watership Down",
"location" : {
"lat" : 51.235685,
"long" : -1.309197
},
"residents" : [ {
"name" : "Fiver",
"age" : 4,
"role" : null
}, {
"name" : "Bigwig",
"age" : 6,
"role" : "Owsla"
} ]
}

如果我做
val transformer1 = (__ \ 'name).json.update(of[JsValue].map(a => JsString("x")))

更改 name字段到 "x"它工作正常。

但是如果我想递归地将所有名称更改为 "x" ,我以为我可以使用递归jsPath,如下所示:
val transformerRecursive = (__ \\ 'name).json.update(of[JsValue].map(a => JsString("x")))

但是当我尝试时,我收到此错误:

scala> jsobject.transform(transformerRecursive) res1: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsError(List((//name,List(ValidationError(List(error.path.result.multiple),WrappedArray())))))



我应该如何在 playframework 中使用带有 JSON Transformer 的递归路径?

最佳答案

正如@irundaia 所说,您需要遍历数组并更新每个值(为此使用 Reads.list):

val t = (__ \ "residents").json.update(
Reads.list(
(__ \ "name").json.update(
Reads.pure(JsString("x"))
)
).map(JsArray)
)

scala> res1: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"name":"Watership Down","location":{"lat":51.235685,"long":-1.309197},"residents":[{"name":"x","age":4,"role":null},{"name":"x","age":6,"role":"Owsla"}]},/residents)

关于scala - Play 框架 JSON 转换器,如何使用递归路径 (jsPath)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39233211/

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