gpt4 book ai didi

json - 通过将项目添加到其包含数字数组的分支之一来更新 JsObject

转载 作者:行者123 更新时间:2023-12-01 00:53:45 28 4
gpt4 key购买 nike

我有 JsObject动态内容,例如可能如下所示:

{
"foo": "bar",
"viewedTaskIds": [1, 2, 3, 4]
}
viewedTaskIds是一个整数数组。

我想做的是更新这个 JsObject并添加一个新号码(比方说 5 )到 viewTaskIds .我希望结果是 JsObject .

如何在 Play Framework Scala 应用程序 (v2.3) 中执行此操作?

编辑 : 万一分支 viewedTaskIds不存在,它应该用一个只包含新数字的数组创建。

最佳答案

您可以使用 JSON 转换器。特别是,你想做一个 update在一个分支上。

val transformer = (__ \ "viewedTaskIds").json.update(
__.read[JsArray].map(_.append(JsNumber(5)))
)

这将查找您要更新的数组所在的分支。 update接受 Reads[A <: JsValue]来转换值(value)。我们将其读作 JsArray ,然后 map追加 JsNumber(5) ,如果成功。

然后我们需要做的就是将变压器应用到 JsValue :
val js = Json.parse("""{
"foo": "bar",
"viewedTaskIds": [1, 2, 3, 4]
}""")

scala> js.transform(transformer)
res6: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"foo":"bar","viewedTaskIds":[1,2,3,4,5]},/viewedTaskIds)

如果您想提供分支有错误的空数组,您可以添加 orElse到变压器和电源 Reads.pure(JsArray())以确保它存在。
val transformer = (__ \ "viewedTaskIds").json.update(
__.read[JsArray].orElse(Reads.pure(JsArray())).map(_.append(JsNumber(5)))
)

不幸的是,当路径根本不存在时,我很难找到一个很好的解决方案来提供一个空数组。 orElse不起作用,因为路径不在变压器的顶层。有效的是提供后备变压器。它不是很漂亮,而且这种形式很粗糙,但它有效:
val fallback = __.json.update((__ \ "viewedTaskIds").json.put(JsArray(Seq(JsNumber(5)))))

scala> js.transform(transformer).orElse(js.transform(fallback))
res19: play.api.libs.json.JsResult[play.api.libs.json.JsObject] = JsSuccess({"foo":"bar","viewedTaskIds":[5]},)

关于json - 通过将项目添加到其包含数字数组的分支之一来更新 JsObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653265/

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