使用writer的json的通用case类

时间:2014-04-18 12:27:52

标签: json scala serialization

我正在尝试将此模型转换为Json,但我总是收到错误“找不到匹配unapply参数的应用函数”。

我试图实现两个不同的写作,但两个都不起作用。

这是我的模特:

case class Page[T](
    var data: List[T],
    var previous: String,
    var next: String,
    var totalPageCount: Int)(implicit val tWrites: Writes[T])

object Page {

    // Both Writters generate an "No apply function found matching unapply parameters" error
    implicit val pageWrites = Json.writes[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)
        }
    }
}

有没有人有解决方案?

1 个答案:

答案 0 :(得分:4)

如果可能,语法可能如下所示:

implicit def pageWrites[T: Writes]: Writes[Page[T]] = Json.writes[Page[T]]

不幸的是,这不适用于JSON Inception(位于Json.writes后面的宏),因此您需要使用标准的简写:

implicit def pageWrites[T: Writes]: Writes[Page[T]] = (
  (__ \ 'data).write[List[T]] and
  (__ \ 'previous).write[String] and
  (__ \ 'next).write[String] and
  (__ \ 'totalPageCount).write[Int]
)(unlift(Page.unapply[T]))

作为旁注,从模型代码中删除对序列化的担忧可能是个好主意 - 您可以删除隐式Writes参数并使用此处给出的pageWrites