アレッ*_*ックス 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].
我喜欢这个解决方案有trait,但如果你想使你的情况下,通用类,你可以使用2种方法之一。
如果你没有使用Page[_],即你总是叫toJson上Page[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)
我不认为您可以为任何类型参数提供通用编写器。我建议如下:
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)
| 归档时间: |
|
| 查看次数: |
4390 次 |
| 最近记录: |