创建案例外的类的自定义JsObject

时间:2018-07-11 08:41:47

标签: scala play-json

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)

有没有更好的建议,看起来会更优雅?

1 个答案:

答案 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

请注意MongoModelbackticks的用法。