首先,我是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的例子。
答案 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._