im在我的api中获得一些类似于以下的case类:
case class UserUpdate(
name: Option[String],
age: Option[String],
city: Option[String])
从这个案例类中,我需要为mongo构建update 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)
有没有更好的建议,看起来会更优雅?
答案 0 :(得分:0)
一种选择是将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
中backticks的用法。