gpt4 book ai didi

json - 玩 anorm,从 json 创建模型,而不在 json 中传递 anorm PK 值

转载 作者:行者123 更新时间:2023-12-01 22:54:53 27 4
gpt4 key购买 nike

object Users  {

implicit object UserReads extends Reads[User] {
def reads(json: JsValue) = JsSuccess(User(
Id((json \ "id").as[String].toLong),
(json \ "name").as[String],
(json \ "email").as[String]
}
implicit object UserWrites extends Writes[User] {
def writes(user: User) = JsObject(Seq(
"id" -> JsNumber(user.id.get),
"name" -> JsString(user.name),
"email" -> Json.toJson(user.email)
}

def view(id: Long) = Action { implicit request =>
Ok(Json.toJson(User.find(id)))
}

def all() = Action { implicit request =>
Ok(Json.toJson(User.findAll()))
}

def save = Action(parse.json) { request =>
val userJson = request.body
val user = userJson.as[User]
try {
User.create(user)
Ok("Saved")
} catch {
case e: IllegalArgumentException => BadRequest("Error")
}
}
}


case class User(
id: Pk[Long] = NotAssigned,
name: String = "",
email: String = "")

上面两个是我的 Controller 和模型,当我使用 Angular JS 将用户数据 [id、name、email] 作为 json 发送时,它会在数据库中创建 User 对象。但当我仅输入 [姓名,电子邮件] 或仅输入 [姓名] 时,它应该能够创建,因为电子邮件可能为空。如果我没记错的话我应该在 User 的读写方法中调整这些,是吗?

此外,我们可以为不同的目的进行两次读/写吗?如果可以的话,如何实现这一点 - 请提供一些线索。谢谢。

修复了一个问题:

case class User(
id: Pk[Long] = NotAssigned,
name: String = "",
email: Option[String])

implicit object UserReads extends Reads[User] {
def reads(json: JsValue) = JsSuccess(User(
Id((json \ "id").as[String].toLong),
(json \ "name").as[String],
(json \ "email").asOpt[String])
}
implicit object UserWrites extends Writes[User] {
def writes(user: User) = JsObject(Seq(
"id" -> JsNumber(user.id.get),
"name" -> JsString(user.name),
"email" -> Json.toJson(user.email))
}

现在 email 可以为 null,但是 id 呢 - PK[Long]

最佳答案

我没有编译这个,但它应该可以工作:

case class User(
id: Pk[Long] = NotAssigned,
name: String = "",
email: Option[String])

implicit object UserReads extends Reads[User] {
def reads(json: JsValue) = JsSuccess(User(
(json \ "id").asOpt[Long].map(id => Id[Long](id)).getOrElse(NotAssigned)
(json \ "name").as[String],
(json \ "email").asOpt[String])
}
implicit object UserWrites extends Writes[User] {
def writes(user: User) = JsObject(Seq(
"id" -> JsNumber(user.id.get),
"name" -> JsString(user.name),
"email" -> Json.toJson(user.email))
}

基本上,您将 ID 作为Option[Long],就像处理电子邮件一样。然后检查它是否已设置,如果设置了,则使用 Id[Long](id) 创建 Pk 实例,如果没有设置,则提供 NotAssigned Pk 单例实例。

额外提示

或者您可以尝试使用

implicit val jsonFormatter = Json.format[User]

它将在编译时直接为您创建读取写入。如果直接使用异常对象,则会出现两个问题:

首先您需要 Pk[Long] 的格式

implicit object PkLongFormat extends Format[Pk[Long]] {
def reads(json: JsValue): JsResult[Pk[Long]] = {
json.asOpt[Long].map {
id => JsSuccess(Id[Long](id))
}.getOrElse(JsSuccess(NotAssigned))
}
def writes(id: Pk[Long]): JsNumber = JsNumber(id.get)
}

其次,如果您根本不发送 id,甚至值为 null,则它不起作用,因此您的客户端需要发送 {"id": null, "name": "Tim"} 因为它甚至不会尝试调用可以处理 JsUndefined 的 PkFormatter,而只是给您一个“validate.error.missing-path”错误

如果您不想发送 null id,则不能使用宏 Json.format[User]

关于json - 玩 anorm,从 json 创建模型,而不在 json 中传递 anorm PK 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666191/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com