如何更换在播放一个JSON值的值?
代码来说明:
def newReport() = Action(parse.json) { request =>
var json = request.body
if((json \ "customerId").as[Int] == -1){
// replace customerId after some logic to find the new value
}
json.validate[Report](Reports.readsWithoutUser).map {
case _: Report =>
根据该播放文档 ,JsObjects有一个方法++
,将合并两个JsObjects。 所以,当你有你的新的整数值,你只需要:
val updatedJson = json.as[JsObject] ++ Json.obj("customerId" -> newValue)
你可以使用Play的2.4.x的+
:
val updatedJson = json.as[JsObject] + ("customerId" -> newValue)
(注: +
已加入的2.1.x方法,但增加了一个成对的场的对象,而不是在版本替换现有值的到2.4.x)之前
沿着线的东西:
val updatedJson = if((request.body \ "customerId").as[Int] == -1){
val newId = JsObject(Seq(("customerId",JsString("ID12345"))))
(request.body ++ newId).as[JsValue]
} else request.body
updatedJson.validate[Report](Reports.readsWithoutUser).map {
case _: Report =>
一种方法是,如马克·乙称,JSON转换成类似的情况下类,操作这些,然后创建一个新的JSON。
但是你也可以使用JSON“变形金刚”。 你做什么有效的是建立一个读取[某件事]对象。 该对象被传递到变换方法,您的JSON对象调用。 它将改变JSON对象,并返回一个成功(结果)或失败(错误),其中结果是新修改的JSON。 这里有一个(相对) 很简单的例子:
使用格式的JSON:{键 - >值}
def jsonXForm(value: String) = (__ \ "customerId").json.update(
(__ \ "customerId").json.put(JsString(value))
)
json.transform(jsonXForm(yourNewValue)) match {...}`
有一个不错的指南这里
我考虑搬走那些不可改变的“JSON”的解决方案的。 它只是使代码乌七八糟。 这是怎么会看在JSON的SON :
import nl.typeset.sonofjson._
val json = …
if (json.customerId.as[Int] == -1) {
json.customerId = 987938
}
Zeimyth的回答一个华而不实的版本,使用隐式转换
implicit class JsObjectEnhancer(jsObject: JsObject) {
def update(args: (String, Json.JsValueWrapper)*): JsObject = {
jsObject ++ Json.obj(args: _*)
}
}
用法 (JSON的类型必须是JsObject的和隐式类应该在范围)
json.update("customerId", 1000)