如何在Play中替换JSON值

时间:2013-02-01 15:05:41

标签: json scala playframework-2.0 playframework-2.1

如何在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 =>

5 个答案:

答案 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)