一尘不染

Play Framework-将字段添加到JSON对象

json

我在使用Scala将字段添加到Play Framework中的Json对象时遇到问题:

我有一个包含数据的案例类。例如:

case class ClassA(a:Int,b:Int)

并且我能够使用Json Writes创建一个Json对象:

val classAObject = ClassA(1,2)
implicit val classAWrites= Json.writes[ClassA]
val jsonObject = Json.toJson(classAObject)

并且Json看起来像:

{ a:1, b:2 }

假设我想向Json对象添加一个附加的’c’字段。结果:

{ a:1, b:2, c:3 }

如何在不创建新案例类或使用Json.obj自己创建Json对象的情况下做到这一点?我正在寻找类似的东西:

jsonObject.merge({c:3})

任何帮助表示赞赏!


阅读 261

收藏
2020-07-27

共1个答案

一尘不染

JsObject有一种+方法可让您向对象添加字段,但是很遗憾,您jsonObject的类型是JsValue,而不是JsObject。您可以通过两种方法解决此问题。首先是使用as

 scala> jsonObject.as[JsObject] + ("c" -> Json.toJson(3))
 res0: play.api.libs.json.JsObject = {"a":1,"b":2,"c":3}

as本质上讲,您很沮丧-
告诉编译器,“您只知道这是一个JsValue,但请相信我,它也是一个JsObject”。在这种情况下,这是安全的,但这不是一个好主意。一种更原则的方法是OWrites直接使用:

scala> val jsonObject = classAWrites.writes(classAObject)
jsonObject: play.api.libs.json.JsObject = {"a":1,"b":2}

scala> jsonObject + ("c" -> Json.toJson(3))
res1: play.api.libs.json.JsObject = {"a":1,"b":2,"c":3}

也许有一天,该Json对象将具有toJsonObject需要OWrites实例的方法,而这种过于显式的方法将不是必需的。

2020-07-27