代码之家  ›  专栏  ›  技术社区  ›  JohnBigs

创建自定义JSObject-Out-Case类

  •  1
  • JohnBigs  · 技术社区  · 6 年前

    我正在进入我的API中的一些case类,如下所示:

    case class UserUpdate(
      name: Option[String], 
      age: Option[String], 
      city: Option[String])
    

    从这个case类中,我需要为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)
    

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mario Galic    6 年前

    UserUpdate MongoModel

    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
    

    backticks