Play 框架 - 向 JSON 对象添加字段 [英] Play Framework - add a field to JSON object

查看:22
本文介绍了Play 框架 - 向 JSON 对象添加字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用 Scala 向 Play Framework 中的 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 框架 - 向 JSON 对象添加字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆