如何在Play中替换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 =>
答案 0 :(得分:28)
根据Play Documentation,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之前版本中的现有值。
答案 1 :(得分:2)
有些事情:
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 =>
答案 2 :(得分:2)
正如Marc B所说,一种方法是将JSON转换为类似案例类的东西,操纵它,然后创建一个新的JSON。
但是你也可以使用JSON'变形金刚'。有效的做法是构建一个Reads [SomeThing]对象。此对象将传递给您在JSON对象上调用的transform方法。它将更改JSON对象并返回Success(结果)或Failure(错误),其中result是新修改的JSON。这是一个(比较)非常简单的例子:
使用格式的json:{key - >值}
>>> def categorizer(val, d={}):
... for i in val:
... d.setdefault(floor(i*100),[]).append(i)
... return d.values()
有一个体面的指南here
答案 3 :(得分:1)
我考虑放弃所有那些不可变的" JSON"解决方案。它只是让代码变得糟透了。这就是它在SON of JSON中的外观:
import nl.typeset.sonofjson._
val json = …
if (json.customerId.as[Int] == -1) {
json.customerId = 987938
}
答案 4 :(得分:0)
使用隐式转换的Zeimyth答案的美化版本
implicit class JsObjectEnhancer(jsObject: JsObject) {
def update(args: (String, Json.JsValueWrapper)*): JsObject = {
jsObject ++ Json.obj(args: _*)
}
}
用法(json必须是JsObject类型,隐式类应该在范围内)
json.update("customerId", 1000)