我正在使用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但找不到任何解决方案。
答案 0 :(得分:1)
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"}