我有一些代码通过Stream
使用 spray.json 将案例类转换为 json 表示来流式传输响应。这适用于单个案例类,但我想对其进行泛化。
所以我从这样的案例类开始:
import spray.json._
import spray.json.DefaultJsonProtocol._
case class Item(foo: String, bar: Int)
case class Report(baz: String, stream: Stream[Item])
object Protocol { implicit val ItemFormat = jsonFormat2(Item) }
在我的报告流式传输方法中,我有这样的代码(高度简化):
def streamReport(...) {
import Protocol._
val handler: PartialFunction[Try[Any], String] = {
case Success(Report(_, stream)) =>
stream.head.toJson.compactPrint
}
}
我想做的是泛化Report
以支持更多项目:
case class Report[T](baz: String, stream: Stream[T])
但是现在,当然,该方法在 type 的范围内streamReport
找不到 a 。JsonWriter
Any
如果我添加一个上下文绑定到的类型参数,我可以做一些接近我想要的事情streamReport
,并直接传入Report
:
def jsonStream[T : JsonWriter](report: Report[T]): String =
implicitly[JsonWriter[T]].write(report.stream.head).compactPrint
但是,我无法弄清楚如何让它与PartialFunction
. 以下内容无法编译(也不完全适合,因为部分函数的签名与上面不同):
def handler[T : JsonWriter](): PartialFunction[T, String] = {
case Success(Report(_, stream)) =>
implicitly[JsonWriter[T]].write(report.stream.head).compactPrint
}
我不确定哪里出了问题。它与类型擦除有关,还是与Try[Any]
我的部分函数的参数类型有关?如何获得流的元素类型所需的隐式 JsonWriter?