3

首先,我对 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)
}

我不明白到底发生了什么,并且找不到有关如何序列化/反序列化异常的示例。

4

1 回答 1

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._
于 2013-03-12T09:15:58.277 回答