3

我正在尝试包装 spray-json 解析器,使其返回Option而不是引发异常。

作为第一步,我只是试图用我自己的方法包装该方法,但我在使其通用时遇到了问题。

解析器使用隐式格式对象(它是为我正在使用的具体类型定义的)但是当该方法是通用的时,编译器会抱怨:

[error]     Cannot find JsonReader or JsonFormat type class for T
[error]     def parse[T](s: String): T = JsonParser(s).convertTo[T]

以下是相关代码:

case class Person(name: String)

object Protocols {
  implicit val personFormat = jsonFormat1(Person)
}

import spray.json._

object Parser {
  import com.rsslldnphy.json.Protocols._
  // JsonParser(s).convertTo[Person] works fine, but..
  def parse[T](s: String): T = JsonParser(s).convertTo[T]  // .. doesn't
}  

我需要做什么才能使其正常工作?

4

1 回答 1

5

您需要传递所需的隐式值,这可以使用“上下文绑定”快捷表示法方便地完成:

def parse[T : JsonReader](s: String): T =
  JsonParser(s).convertTo[T]

这相当于:

def parse[T](s: String)(implicit reader: JsonReader[T]): T =
  JsonParser(s).convertTo[T]

请参阅Scala 中的“上下文绑定”是什么?

于 2012-11-10T21:07:07.360 回答