json - 如何使用 Play Framework 2.1-RC2 中新的 JSON API 读写 Anorm 对象?

标签 json scala playframework-2.0 anorm playframework-2.1

我正在尝试将 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 初始宏吗?

最佳答案

Json Macro Inception 在这里不是一个好的选择,因为这种情况太复杂了。它仅支持经典情况,例如您无法映射值。

在这种情况下,您需要一个特定的格式化程序

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

这有点复杂,因为您的要求是;)

关于json - 如何使用 Play Framework 2.1-RC2 中新的 JSON API 读写 Anorm 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332858/

相关文章:

java - 如何返回JSON格式的信息

scala - 当编译器找到Serializable而不是match类型时,如何解决类型不匹配的问题?

scala - 更新元组列表

java - 通过一对多关系查询 Ebean

java - Play 2,启动时将数据加载到数据库

json - Laravel:在 Eloquent 中解码 JSON

c# - JSON TinyMCE 返回值 "\t"

python - 如何将 pandas dataframe 导出为 json 并保留原始日期时间格式?

java - Scala 中是否有相当于 Python 的 islice 的东西?

java - Play Framework - 使用 Promise.failure(exception) 的方法的接口(interface)