我试图将新元素添加到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"
元素,那很好。
答案 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页。他们不是世界上最伟大的文档,但实际上它们非常彻底。