Play Framework - 向JSON对象添加字段

时间:2014-04-04 06:57:14

标签: 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}) 

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:38)

JsObject有一个+方法,允许您向对象添加字段,但不幸的是,jsonObject被静态输入为JsValue,而不是{{1} }}。你可以通过几种方式解决这个问题。第一种是使用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实例,而且这种过于明确的方法是不必要的。

答案 1 :(得分:6)

我自己找到了解决方案。实际上JsValue,它是Json.toJson的返回类型,没有这样的方法,但JsObject(http://www.playframework.com/documentation/2.2.x/api/scala/index.html#play.api.libs.json.JsObject)没有,所以解决方案是:

val jsonObject = Json.toJson(classAObject).as[JsObject]
jsonObject + ("c", JsNumber(3)) 

我希望有人会觉得这很有用:)

答案 2 :(得分:-1)

更简单的方法是使用argoanut(http://argonaut.io/

var jField : Json.JsonField = "myfield" //Json.JsonField is of type String
obj1.asJson.->:(jField, obj2.asJson)  // adds a field to obj1.asJson

此处obj1.asJson创建一个JSON对象 和obj2是要添加到obj1.asJson

创建的json的对象