簡體   English   中英

Scala更新jsobject密鑰

[英]Scala update a jsobject key

我正在使用play api。 我想更新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,但是找不到任何解決方案。

JsObject是不可變的,因此您不能“更新”它,但是可以基於現有對象構造新對象,並替換某些字段。

奇怪的是,在JsObject上沒有這樣的方法。 JsObject.+不檢查密鑰是否已經存在,對我來說似乎是個錯誤。

您可以使用++ ,它將兩個對象合並在一起:

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"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM