添加元素到JsValue?

bad*_*ala 4 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)
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Mic*_*jac 9

你可以这样做JsObject,扩展JsValue并有一个+方法:

val rJson: JsValue = Json.parse(response)
val imgId = ...
val returnJson: JsObject = rJson.as[JsObject] + ("imgId" -> Json.toJson(imgId))
Json.stringify(returnJson)
Run Code Online (Sandbox Code Playgroud)

  • `Json.parse`与答案无关.唯一重要的部分是第3行. (3认同)

acj*_*jay 7

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

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

,可以用作JSON变换器:

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

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

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

即使API很复杂,我强烈建议花一些时间阅读有关JSON处理Play框架文档,共5页.他们不是世界上最伟大的文档,但他们实际上非常彻底.