如何在Play框架2.1-RC2中使用新的JSON API读写Anorm对象?

3

我将我的Play 2.0.x应用程序迁移到Play 2.1-RC2,并遇到了以下问题。在我的应用程序中,我有一个类似于以下的案例类:

case class Player(
  playerId: Pk[Long],
  name: Option[String],
  groupId: Long
)

在我的Play 2.0.x代码中,我有一个PlayerFormat对象,用于读取和写入JSON实例。它的代码如下:

object PlayerFormat extends Format[Player] {

def reads(json: JsValue): Player = Player(
    (json \ "id").asOpt[Long].map( Id(_) ).getOrElse( NotAssigned ),
    (json \ "name").asOpt[String],
    (json \ "group" \ "id").as[Long]
)

def writes(p: Player): JsValue = toJson(
  Map(
      "id" -> toJson(p.playerId.toOption),
      "name" -> toJson(p.name),
      "group" -> toJson(
          Map("id" -> p.groupId)
      )    
  )
)

}

问题是:“在Play 2.1中如何读取可选(可空)属性“id”,并根据其是否存在将playerId属性设置为Id[Long]NotAssigned?”

此外,这能否以某种方式重写以使用JSON内部宏?

1个回答

4
Json宏嵌套在这里不是一个好选择,因为这种情况过于复杂。它只支持经典案例,例如您无法映射值。
在这种情况下,您需要一个特定的格式化程序。
import play.api.libs.json._
import play.api.libs.functional.syntax._
import anorm._

implicit val playerFormat = (
    (__ \ "id").formatNullable[Long] and
    (__ \ "name").formatNullable[String] and
    (__ \ "group" \ "id").format[Long]
)((id, name, group) => Player(id.map(Id(_)).getOrElse(NotAssigned), name, group), 
  (p: Player) => (p.playerId.toOption, p.name, p.groupId))

由于您的要求较为复杂,这会有一点点难度 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接