4

私の目は私をだましていますか、それとも間に配列要素を含む JsPath を持つネストされたノードを更新できませんか? (例 /a/b(0)/c)

val pnJson = Json.parse("""{"a": {"b": [ {"c": { "d": 1 } } ] } } """)                                     
val pnJsPath = (__ \ "a" \ "b")(0) \ "c"                                                                   
val pnTrans = pnJsPath.json.update ( __.read[JsObject].map{ _ ++ Json.obj( "e" -> 2 )} )

pnJson.transform(pnTrans)

//結果: java.lang.RuntimeException: 予想される KeyPathNode

__.json.update を使用できない場合、どうすればこれを達成できますか? 不変でこれを達成しようとしています。

4

2 に答える 2

3

簡単な答えは、 ではそれができないということですJsPath。そのチケットでは、JsZipperライブラリを使用することが、JSON を操作するためのより良い方法として言及されています。それを使用することを選択した場合は、次のことができます。

scala> import play.api.libs.json.extensions._
import play.api.libs.json.extensions._

scala> import play.api.libs.json.monad.syntax._
import play.api.libs.json.monad.syntax._

scala> val pnJson = Json.parse("""{"a": {"b": [ {"c": { "d": 1 } } ] } } """) 
pnJson: play.api.libs.json.JsValue = {"a":{"b":[{"c":{"d":1}}]}}

scala> val pnJsPath = (__ \ "a" \ "b")(0) \ "c" 
pnJsPath: play.api.libs.json.JsPath = /a/b(0)/c

scala> pnJson.update(pnJsPath, _.set(__ \ "e" -> JsNumber(2)))
res0: play.api.libs.json.JsValue = {"a":{"b":[{"c":{"d":1,"e":2}}]}}

それ以外の場合は、タスクを 2 つの部分に分割することをお勧めします。最初の部分は配列を解析し、2 番目の部分はそれを変更された内容の新しい配列に変換します。

于 2014-10-10T05:35:29.580 に答える