scala - 在案例类之外创建自定义 JsObject
问题描述
我进入我的 api 一些看起来像这样的案例类:
case class UserUpdate(
name: Option[String],
age: Option[String],
city: Option[String])
从这个案例类中,我需要为 mongo 构建更新 json,如下所示:
{"basicInfo.name": "new nameeee","age.vatId": "23"}
由于所有字段都是可选的,我需要检查这些字段并通过定义的字段构建它。
所以我做了这样的事情:
val updateAsMap = Json.toJson(userUpdateObj).as[JsObject]
.fields.map(fieldTpl => fieldTpl.copy(_1 = s"basicInfo.${fieldTpl._1}")).toMap
val userUpdateJson = Json.toJson(updateAsMap)
val query = json("userId" -> userId)
val update = json("$set" -> userUpdateJson)
有没有更好的建议,看起来更优雅的东西?
解决方案
一种选择可能是转换UserUpdate
为中间案例类,例如MongoModel
,然后转换MongoModel
为 JSON。例如,
import play.api.libs.json._
case class MongoModel(
`basicInfo.name`: Option[String] = None,
`age.vatId`: Option[String] = None
)
object MongoModel {
implicit val codec = Json.format[MongoModel]
}
case class UserUpdate(
name: Option[String] = None,
age: Option[String] = None,
city: Option[String] = None
) {
def toMongoModel =
MongoModel(
`basicInfo.name` = name,
`age.vatId` = age
)
}
val userUpdate = UserUpdate(name = Some("new nameeee"), age = Some("23"))
Json.toJson(userUpdate.toMongoModel) // {"basicInfo.name": "new nameeee", "age.vatId": "23"}: JsValue
注意反引号的用法MongoModel
。
推荐阅读
- laravel - laravel 控制台中的错误请求状态消息
- javascript - 处理大量数据的最佳方法
- r - 避免嵌套列表的嵌套 for 循环
- javascript - 接口类型的数组
- c# - 使用 HtmlAgilityPack 进行 Web 查询抛出 System.Net.WebException:请求被中止:无法创建 SSL/TLS 安全通道
- typescript - 如何从格式为“08/01/2018”的日期减少 1 年?
- java - 更新 Spinner 失去了它的风格
- php - Wordpress - 从自定义帖子类型中获取自定义字段
- asp.net - 如何在asp.net的gridview中获取复选框值
- java - Evaluator 类导入没有进入 ignite-ml 依赖项?