2014-10-18 45 views
0

我正在使用玩api。我想更新JsObject中的一個鍵。我該怎麼做。這是我的代碼斯卡拉更新一個jsobject密鑰

import play.api.libs.json._ 
var sessionJson = Json.toJson(
           Map(
            "sId" -> toJson(sId), 
            "events" -> Seq(
                toJson(
                  Map(
                   "eType" : toJson((eventJson \ "eType").as[String]), 

                 ) 
              ) 
            ) 
           ) 
        ) 

def reduceFunction(sessionJson1 : JsObject, sessionJson2: JsObject) = { 
    var eventList = (sessionJson1 \ "events").as[Seq] ++ (sessionJson2 \ "events").as[Seq] 
    println(eventList) 
    //I want to do something like this 
    sessionJson1['events'] = eventList 
} 

我已經通過https://www.playframework.com/documentation/2.1.1/ScalaJsonTransformers,但找不到任何解決方案。

回答

1

JsObject是不可變的,所以你不能「更新」它,但你可以建立一個新的對象基於現有的一些領域取代。

奇怪的是,在JsObject上沒有這樣的方法。 JsObject.+不檢查密鑰是否已經存在,看起來像是一個bug。

你可以使用++,它合併兩個對象組合在一起:

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

scala> val j = Json.obj("firstName" -> "John", "secondName" -> "Doe") 
j: play.api.libs.json.JsObject = {"firstName":"John","secondName":"Doe"} 

scala> j ++ Json.obj("firstName" -> Json.toJson("Jane")) 
res0: play.api.libs.json.JsObject = {"secondName":"Doe","firstName":"Jane"} 

或者你也可以很容易地構建這樣的功能:

def withField[A](j: JsObject, key: String, value: A)(implicit w: Writes[A]) = 
    j ++ Json.obj(key -> value) 

scala> withField(j, "firstName", "Jane") 
res1: play.api.libs.json.JsObject = {"secondName":"Doe","firstName":"Jane"}