Play使用泛型类型参数写入

cer*_*ran 3 json scala playframework

我有一个Processor看起来像这样的特征:

trait Processor[A] {
  def process(in: Seq[Byte]): Result[A]
}

trait Result[A]{
  val ok: Boolean
  val errorMessage: Option[String]
  val data: Option[A]
}
Run Code Online (Sandbox Code Playgroud)

具体实施:

class StringProc extends Processor[String] {
  def process(in: Seq[Byte]): StrResult
}

case class StrResult(...) extends Result[String]
object StrResult {
  implicit val writes = Json.writes[StrResult]
}
Run Code Online (Sandbox Code Playgroud)

当使用StringProc实例作为类型时Processor[String],process不出所料的返回类型Result[String]不是StrResult.不幸的是,Writes[StrResult]在这种情况下似乎没用:

找不到类型为Result [String]的Json序列化程序

我怎么能处理这种情况?

cch*_*tep 6

你可以试试

object Result {
  implicit def resWrites[T](implicit nested: Writes[T]): Writes[Result[T]] = OWrites[Result[T]] { res =>
    Json.obj("ok" -> res.ok, "errorMessage" -> res.errorMessage,
      "data" -> nested.writes(res.data))
  }
}
Run Code Online (Sandbox Code Playgroud)