smk*_*smk 3 json anorm playframework-2.0
首先,我是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))
Run Code Online (Sandbox Code Playgroud)
然后它给了我一个错误,说没有为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)
}
Run Code Online (Sandbox Code Playgroud)
我不明白究竟发生了什么,并且可以找到一个关于如何序列化/反序列化anorm的例子.
JSON序列化器/反序列化器支持JSON规范涵盖的所有基本值.如果要序列化自定义类型,则必须告诉序列化程序如何执行此操作.
Play的JSON序列化程序使用称为类型类的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._
Run Code Online (Sandbox Code Playgroud)