Спрей Json: преобразование универсального типа в JsonFormat - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть класс, похожий на 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.

ошибка: не удалось найти неявное значение для параметра подтверждения типа Convertor.this.JF [K] неявный val преобразователь = jsonFormat2 (пары [K, V]) ^

Но как я могу привести общий тип данных в область видимости. Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вам необходимо предоставить 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}
0 голосов
/ 13 сентября 2018

K и V может быть всем (Any). Поскольку у вас нет для всего Convertor, вы должны ограничить K и V.

case class Pairs[K <: PairKey, V <: PairValue](key:K, value: V)

Теперь вам нужно предоставить конвертеры для PairKey и PairValue и всех их дочерних элементов.

Здесь вы найдете информацию: spray-json # jsonprotocol

...