json - Play Framework - 向 JSON 对象添加字段

标签 json scala playframework playframework-2.0

我在使用 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/

相关文章:

json - 具有错误处理功能的 Aeson 和 Lenses

使用 scala.util.parsing.json 在 Scala 中解析 Json

scala - JsResult - Monad 还是 Applicative?

mongodb - 使用 cashbah 在 Scala 中更新 Mongo 文档

jpa - 阿瓦杰·伊比安。多对多延迟 BeanSet

r - 将不等长列表的列表转换为数据帧

jQuery $.getJSON : "Failed to load resource: cancelled"

scala - 从 Spark 中的 Google 存储桶中读取文件

java - 更新查询而不是选择+保​​存

javascript - 如何在 Javascript 中将数组更改为对象?