7

json オブジェクトを配列項目に追加する際に問題が発生しています。この問題はかなり長い間私を悩ませてきましたが、まだそれを修正する方法がわかりません.

配列項目に json オブジェクトを追加したいのですが、以下は既存の json オブジェクトです。

{
  "key1":[ 
          {"key11":"value11"},
          {"key12":"value12"}
         ]
}

新しいjsonオブジェクトを追加して変換したい:

{
   "key1":[ 
           {"key11":"value11" , "key111":"value111"},
           {"key12":"value12"}
         ]
}

これが私のコードです:

val json = Json.obj( 
         "key1" ->Json.arr(
                        Json.obj("key11" -> "value11"),
                        Json.obj("key12" -> "value12")
         )
)

val transform= (__ \ 'key1 )(0).json.update(  __.read[JsObject].map{ o => o ++ Json.obj( "key111" -> "value111" ) } )

json.validate(transform)

ただし、最後の行には以下の例外があります。json オブジェクトを配列項目に追加するという私の目標を達成する方法について、誰かが提案してくれますか?

java.lang.RuntimeException: expected KeyPathNode
at play.api.libs.json.JsPath$.step$1(JsPath.scala:141)
at play.api.libs.json.JsPath$.step$1(JsPath.scala:144)
at play.api.libs.json.JsPath$.play$api$libs$json$JsPath$$buildSubPath$1(JsPath.scala:150)
at play.api.libs.json.JsPath$$anonfun$createObj$1.apply(JsPath.scala:155)
at play.api.libs.json.JsPath$$anonfun$createObj$1.apply(JsPath.scala:153)
at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:51)
at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:60)
at scala.collection.mutable.WrappedArray.foldLeft(WrappedArray.scala:34)
at play.api.libs.json.JsPath$.createObj(JsPath.scala:153)
at play.api.libs.json.PathReads$$anonfun$jsUpdate$1$$anonfun$apply$15.apply(JsConstraints.scala:81)
at play.api.libs.json.PathReads$$anonfun$jsUpdate$1$$anonfun$apply$15.apply(JsConstraints.scala:81)
at play.api.libs.json.JsResult$class.map(JsResult.scala:73)

聞いてくれてありがとう

シリル

4

1 に答える 1

10

配列全体を選択し、それを次のような新しい配列に変換する必要があります。

val transform= (__ \ "key1" ).json.update(
  __.read[JsArray].map { a => 
    JsArray(a.value.updated(0, a(0).as[JsObject] ++ Json.obj("key111" -> "value111")))
  }
)
于 2013-03-21T10:06:43.973 に答える