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 でオプションの (nullable) プロパティ "id" を読み取り、その存在に基づいてplayerId属性をどちらかId[Long]またはどちらかに設定するにはどうすればよいNotAssignedか」です。

また、JSON インセプション マクロを使用するように何らかの形で書き直すことはできますか?

4

1 に答える 1

4

このケースは複雑すぎるため、JsonMacroInceptionはここでは適切な選択ではありません。map古典的なケースのみをサポートし、例の値を指定することはできません。

この状況では、特定のフォーマッターが必要です

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))

要件がありますので、少し複雑です;)

于 2013-01-15T20:53:47.907 に答える