Anorm的JSON解串器

时间:2013-03-12 01:29:04

标签: json playframework-2.0 anorm

首先,我是Play 2 Scala的新手。我正在尝试将我的模型对象转换为JSON。

根据此博客http://mandubian.com/2012/10/01/unveiling-play-2-dot-1-json-api-part2-writes-format-combinators/ 这就是我试过的

    case class Facility(id:Pk[Int],name:String)

object Facility{

    implicit val facilityWriter = (
     (__ \ "id").write[Pk[Int]] and
     (__ \ "name").write[String]
)(unlift(Facility.unapply))

然后它给了我一个错误,说没有找到Pk [Int]

的JSON反序列化器

所以我尝试过这样的事情(经过一段谷歌搜索)

implicit object PkFormat extends Format[Pk[Int]] {

    def reads(json:JsValue): Pk[Int] = Id(json.as[Int])
    def writes(id:Pk[Int]):JsNumber = JsNumber(id.get)
}

我不明白到底发生了什么,并且找到了一个关于如何序列化/反序列化anorm的例子。

1 个答案:

答案 0 :(得分:5)

JSON序列化程序/反序列化程序支持JSON规范涵盖的所有基本值。如果要序列化自定义类型,则必须告诉序列化程序如何执行此操作。

Play的JSON序列化程序使用名为 type class 的Scala(最初是Haskell)模式。简而言之,它允许多态而无需子类化。这是通过在范围中引入隐式值来实现的,即,为了处理新类型,您可以定义隐式值/方法/对象。在您的具体示例中,您为Pk[Int]定义了一个类型类实例。

您可以在代码中手动转换Pk[Int],或者像许多其他框架一样直接在Pk类中实现转换,但类型类方法更清晰(因为JSON转换是单独的关注)并且更容易重用(现在你可以在任何你想要的地方转换Pk[Int],即使Pk类本身不支持它,想象一下扩展一个闭源系统。)

至于你的代码,它应该可以正常工作,只需确保你在范围内有必要的导入:

import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Writes._
import play.api.libs.functional.syntax._