3

Option例外をスローするのではなく、を返すように、spray-jsonパーサーをラップしようとしています。

最初のステップとして、メソッドを自分のメソッドでラップしようとしていますが、汎用化するのに問題があります。

パーサーは暗黙のフォーマットオブジェクト(私が使用している具象型に対して定義されている)を使用しますが、メソッドが汎用の場合、コンパイラーは次のように文句を言います。

[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 に答える