无法使用"写入"将通用案例类转换为json

アレッ*_*ックス 8 json scala playframework playframework-2.2

我有一个类,我希望能够转换为json:

case class Page[T](items: Seq[T], pageIndex: Int, pageSize: Int, totalCount: Long)

object Page {

  implicit val jsonWriter: Writes[Page[_]] = Json.writes[Page[_]]
}
Run Code Online (Sandbox Code Playgroud)

错误是 No apply function found matching unapply parameters

小智 9

您可以像这样定义Format[Page[T]]通用案例类Page[T]:

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

implicit def pageFormat[T: Format]: Format[Page[T]] =
  ((__ \ "items").format[Seq[T]] ~
    (__ \ "pageIndex").format[Int] ~
    (__ \ "pageSize").format[Int] ~
    (__ \ "totalCount").format[Long])(Page.apply, unlift(Page.unapply))
Run Code Online (Sandbox Code Playgroud)

虽然此解决方案需要更多类型,但它可以使您的案例类Page[T]不受隐式参数列表的影响,或者需要定义具体的子类Page[T].


sen*_*nia 5

我喜欢这个解决方案trait,但如果你想使你的情况下,通用类,你可以使用2种方法之一。

如果你没有使用Page[_],即你总是叫toJsonPage[Int]Seq[Page[String]],但不能Page[_]Seq[Page[_]]

object Page {
  implicit def pageWriter[T: Writes](): Writes[Page[T]] = Json.writes[Page[T]]
}
Run Code Online (Sandbox Code Playgroud)

如果您必须序列化Page[_]

case class Page[T](items: Seq[T],
                   pageIndex: Int,
                   pageSize: Int,
                   totalCount: Long)(
      implicit val tWrites: Writes[T])

object Page {
  implicit def pageWriter[T]: Writes[Page[T]] = new Writes[Page[T]] {
    def writes(o: Page[T]): JsValue = {
      implicit val tWrites = o.tWrites
      val writes = Json.writes[Page[T]]
      writes.writes(o)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Rad*_*sky 2

我不认为您可以为任何类型参数提供通用编写器。我建议如下:

trait Page[T] {
  val items: Seq[T]
  val pageIndex: Int
  val pageSize: Int
  val totalCount: Long
}

case class IntPage(items: Seq[Int], pageIndex: Int, pageSize: Int, totalCount: Long) extends Page[Int]

object Page {
  implicit def jsonWriter = Json.writes[IntPage]
}
Run Code Online (Sandbox Code Playgroud)