У меня есть класс, аналогичный Pairs
.
У меня есть черта, которая преобразует этот класс Pairs
в формат Json.
import scala.reflect.ClassTag
import spray.json._
import spray.json.DefaultJsonProtocol
case class Pairs[K, V](key:K, value: V)
trait Convertor[K, V] extends DefaultJsonProtocol{
implicit val convertor = jsonFormat2(Pairs[K, V])
}
val p = Pairs[String, Int]("One", 1)
println(p.toJson)
Когда я использую эту черту, я получаю следующую ошибку, чтобы иметь преобразователь для типов K
и V
.
error: could not find implicit value for evidence parameter of type Convertor.this.JF[K] implicit val convertor = jsonFormat2(Pairs[K, V]) ^
Но как я могу включить общий тип данных в область видимости. Кто-нибудь может мне помочь?
K
и V
могут быть всем (Any
). Поскольку у вас не для всего есть Convertor
, вы должны ограничить K
и V
.
case class Pairs[K <: PairKey, V <: PairValue](key:K, value: V)
Теперь вам нужно предоставить преобразователи для PairKey
и PairValue
и всех его дочерних элементов.
Вы можете найти информацию здесь: спрей-json # jsonprotocol
Вам необходимо предоставить JsonFormat как для типа ключа, так и для типа значения.
Этот код
import spray.json.DefaultJsonProtocol._
import spray.json._
case class Pairs[K, V](key: K, value: V)
implicit def pairsFormat[K: JsonFormat, V: JsonFormat] = jsonFormat2(Pairs.apply[K, V])
val p = Pairs[String, Int]("One", 1)
println(p.toJson)
напечатает
{"key":"One","value":1}