2013-02-16 59 views
2

我有一個json對象添加到數組項目的問題。這個問題一直困擾我很長一段時間,但我仍然不知道如何解決它。playframework - 如何更新json的索引數組項目

我想在一個數組項添加JSON對象,下面是現有JSON對象:

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

我想將其與新的JSON對象被轉換加入:

​​

這裏是我的代碼:

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) 

謝謝您聽

西里爾

回答

5

您需要選擇整個陣列和變換到一個新的數組是這樣的:

val transform= (__ \ "key1").json.update(
    __.read[JsArray].map { a => 
    JsArray(a.value.updated(0, a(0).as[JsObject] ++ Json.obj("key111" -> "value111"))) 
    } 
)