我在使用 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
:
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
实例,而这种过于明确的方法将不是必需的.
关于json - Play Framework - 向 JSON 对象添加字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22855710/