I have a problem with adding a field to Json object in Play Framework using Scala:

我有一个包含数据的case类.例如:

case class ClassA(a:Int,b:Int)

我能够使用Json写入创建Json对象:

val classAObject = ClassA(1,2)
implicit val classAWrites= Json.writes[ClassA]
val jsonObject = Json.toJson(classAObject)

and the Json would look like:

{ a:1, b:2 }

假设我想在Json对象中添加一个额外的"c"字段.结果:

{ a:1, b:2, c:3 }

在不创建新的case类或自己使用Json创建Json对象的情况下,我如何做到这一点.obj?我在寻找这样的东西:

jsonObject.merge({c:3}) 

感谢您的帮助!

推荐答案

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}

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}

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.

Json相关问答推荐

在 json 嵌入的 YAML 文件中 - 使用 Python 仅替换 json 值

N1QL 搜索对象内的某些对象

为什么JsonConvert反序列化对象以int但不长失败

解析 JSON API 响应

如何将西里尔字母转换为 utf16

Powershell JSON 操作

无法向 Json 数组添加新元素

在PowerShell中按时间戳过滤JSON

从调试器获取 IntelliJ Idea 中的 JSON 对象

将 TypeScript 与 tsconfig.json 文件一起使用时是否可以包含 json 文件?

在 ASP.NET Core 2.0 Web Api 中返回“原始”json

JSON Jackson 将不同的键解析到同一个字段中

如何将 FormData(HTML5 对象)转换为 JSON

未捕获的 SyntaxError:位置 0 处 JSON 中的意外标记 u

在 React 中导入 JSON 文件

有没有办法将 BigQuery 表的架构导出为 JSON?

ASP.NET Core 返回带有状态码的 JSON

PostgreSQL 重命名 jsonb 字段中的属性

使用 jq 向现有 JSON 数组添加新元素

Python - 如何将 JSON 文件转换为数据框