私は自分のコードに暗黙的なパラメーターを持ち込むのが好きではないので、それらを使用する場所でそれらの使用をカプセル化したいと考えています。そのため、spray-json への呼び出しを例外処理でラップし、モデル クラスごとにデフォルトの暗黙的な JsonFormats を含むオブジェクトを定義しようとしています。ただし、暗黙的なパラメーターは、コードを呼び出すクライアントにインポートされない限り解決されません。これは、まさに私が望んでいない場所です。これが私がこれまでに持っているものです(暗黙のフォーマッタを解決しません)。私がやりたいことを得る方法はありますか?
package com.rsslldnphy.json
import com.rsslldnphy.models._
import spray.json._
object Json extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
def parse[T](s:String)(implicit reader: JsonReader[T]): Option[T] = {
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}
注意。JsonFormat は JsonReader の型です
編集:@paradigmaticの2番目の提案に基づいて私が書いたものは次のとおりです(これは機能しませんが、まだ取得できませんCannot find JsonReader or JsonFormat type class for T
)。何か不足していますか?
object Protocols extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
}
object Json {
def parse[T](s:String): Option[T] = {
import Protocols._
try { Some(JsonParser(s).convertTo[T]) }
catch { case e: DeserializationException => None }
}
}
記録として、これは機能するコード スニペットですが、あまりにも多くのクライアント コードを必要とするため (つまり、スコープ内に暗黙的なコードを含める必要があるため)、回避しようとしています。
object Json extends DefaultJsonProtocol {
implicit val personFormat = jsonFormat1(Person)
implicit val animalFormat = jsonFormat1(Animal)
}
object ClientCode {
import Json._
def person(s: String): Person = JsonParser(s).convertTo[Person]
}