我在使用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})
任何帮助表示赞赏!
JsObject有一种+方法可让您向对象添加字段,但是很遗憾,您jsonObject的类型是JsValue,而不是JsObject。您可以通过两种方法解决此问题。首先是使用as:
JsObject
+
jsonObject
JsValue
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直接使用:
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实例的方法,而这种过于显式的方法将不是必需的。
Json
toJsonObject