Play Framework-将字段添加到JSON对象 [英] Play Framework - add a field to JSON object
问题描述
使用Scala在Play框架中向Json对象添加字段时遇到问题:
I have a problem with adding a field to Json object in Play Framework using Scala:
我有一个包含数据的案例类.例如:
I have a case class containing data. For example:
case class ClassA(a:Int,b:Int)
并且我能够使用Json Writes创建一个Json对象:
and I am able to create a Json object using Json Writes:
val classAObject = ClassA(1,2)
implicit val classAWrites= Json.writes[ClassA]
val jsonObject = Json.toJson(classAObject)
,Json看起来像:
{ a:1, b:2 }
让我们假设我想向Json对象添加一个附加的'c'字段.结果:
Let's suppose I would like to add an additional 'c' field to the Json object. Result:
{ a:1, b:2, c:3 }
如何在不创建新案例类或使用Json.obj自己创建Json对象的情况下执行此操作?我正在寻找类似的东西:
How do I do that without creating a new case class or creating my Json object myself using Json.obj? I am looking for something like:
jsonObject.merge({c:3})
任何帮助表示赞赏!
推荐答案
JsObject
具有+
方法,该方法允许您将字段添加到对象中,但是很遗憾,您的jsonObject
被静态键入为JsValue
,而不是JsObject
.您可以通过两种方法解决此问题.第一种是使用as
:
JsObject
has a +
method that allows you to add fields to an object, but unfortunately your jsonObject
is statically typed as a JsValue
, not a JsObject
. You can get around this in a couple of ways. The first is to use 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
:
With as
you're essentially downcasting—you're telling the compiler, "you only know that this is a JsValue
, but believe me, it's also a JsObject
". This is safe in this case, but it's not a good idea. A more principled approach is to use the OWrites
directly:
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
实例,并且这种过于显式的方法将不是必需的.
Maybe someday the Json
object will have a toJsonObject
method that will require a OWrites
instance and this overly explicit approach won't be necessary.
这篇关于Play Framework-将字段添加到JSON对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!