添加元素到JsValue?

时间:2014-08-03 14:05:04

标签: scala playframework playframework-2.0

我试图将新元素添加到JsValue中,但我不确定如何去做。

 val rJson = Json.parse(response)
 val imgId = //stuff to get the id :Long
 rJson.apply("imgId", imgId) 
 Json.stringify(rJson)

我应该转换为JSONObject还是有一些方法可以直接应用于JsValue以向JSON插入新元素?

编辑:

response来自另一台服务器,但我确实可以控制它。所以,如果我需要向JSON对象添加一个空的"imgId"元素,那很好。

2 个答案:

答案 0 :(得分:9)

您可以JsObject执行此操作,该JsValue扩展+并使用val rJson: JsValue = Json.parse(response) val imgId = ... val returnJson: JsObject = rJson.as[JsObject] + ("imgId" -> Json.toJson(imgId)) Json.stringify(returnJson) 方法:

{{1}}

答案 1 :(得分:6)

我在我正在处理的项目中使用以下助手:

/** Insert a new value at the given path */
def insert(path: JsPath, value: JsValue) =
  __.json.update(path.json.put(value))

,可以用作JSON转换器:

val rJson = Json.parse(response)
val imgId = //stuff to get the id :Long
Json.stringify(rJson.transform(insert(__ \ 'imgId, imgId)))

你绝对可以使用insert方法的主体,但我个人认为变换器API真的是违反直觉的。

关于这一点的好处是可以使用andThen组合任意数量的变换。我们通常使用它将API响应转换为模型的格式,以便我们可以使用Reads反序列化器来实例化模型实例。我们使用这个insert帮助器来模拟尚不存在的API响应部分,以便我们可以在API之前构建我们需要的模型。

尽管API很复杂,但我强烈建议花一些时间阅读Play framework docs on JSON handling全部5页。他们不是世界上最伟大的文档,但实际上它们非常彻底。