Scala 播放框架JSON转换器,如何使用递归路径(jsPath)?

Scala 播放框架JSON转换器,如何使用递归路径(jsPath)?,scala,playframework,Scala,Playframework,假设我有这样一个JSON: { "name" : "Watership Down", "location" : { "lat" : 51.235685, "long" : -1.309197 }, "residents" : [ { "name" : "Fiver", "age" : 4, "role" : null }, { "name" : "Bigwig", "age" : 6, "role" : "Ows

假设我有这样一个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 transformerRecursive = (__ \\ 'name).json.update(of[JsValue].map(a => JsString("x")))
如果我这样做

val transformer1 = (__ \ 'name).json.update(of[JsValue].map(a => JsString("x")))
要将
名称
字段更改为
“x”
,它可以正常工作

但是如果我想递归地将所有名称更改为
“x”
,我想我可以使用递归jsPath,如下所示:

{
  "name" : "Watership Down",
  "location" : {
    "lat" : 51.235685,
    "long" : -1.309197
  },
  "residents" : [ {
    "name" : "Fiver",
    "age" : 4,
    "role" : null
  }, {
    "name" : "Bigwig",
    "age" : 6,
    "role" : "Owsla"
  } ]
}
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的递归路径

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


感谢@andrey.ladniy,我成功地解决了我想清空嵌套JsArray的问题。下面是一个如何做到这一点的示例,仅适用于可能找到任何帮助的任何人:

import play.api.libs.json._

case class D(yay: String, nay: String)
case class C(ds: Seq[D], baz: Boolean)
case class B(cs: Seq[C], bar: Int)
case class A(b: B, foo: String)

implicit val formatD: OFormat[D] = Json.format
implicit val formatC: OFormat[C] = Json.format
implicit val formatB: OFormat[B] = Json.format
implicit val formatA: OFormat[A] = Json.format

val foo = A(
  B(Seq(C(Seq(D("foo", "bar")), true), C(Seq(D("oof", "rab")), false)), 42),
  "test"
)

val dsIgnoringReads =
  (__ \ "b" \ "cs").json.update(Reads.seq((__ \ "ds").json.update(Reads.pure(JsArray()))).map(JsArray))

dsIgnoringReads.reads(Json.toJson(foo)).get
这就产生了

res0: play.api.libs.json.JsObject = 
  {"b":{"cs":[{"ds":[],"baz":true},{"ds":[],"baz":false}],"bar":42},"foo":"test"}

我认为错误报告了
“name
属性有多个匹配项。您可能需要对它们进行迭代并单独更新