Spray Json:将泛型类型转换为JsonFormat

时间:2018-09-13 11:54:10

标签: scala spray-json

我有一个类似于struct X { enum direction { left=’l’, right=’r’ }; int f(int i) { return i==left ? 0 : i==right ? 1 : 2; } }; void g(X* p) { direction d; // error: direction not in scope int i; i = p->f(left); // error: left not in scope i = p->f(X::right); // OK i = p->f(p->left); // OK // ... } 的课程。 我有一个特征,可以将这个Pairs类转换为Json格式。

Pairs

使用此特征时,出现以下错误,为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类型使用了转换器。

  错误:找不到类型为证据的隐式值   Convertor.this.JF [K]            隐式val转换器= jsonFormat2(对[K,V])                                               ^

但是如何将通用数据类型引入范围。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

您需要同时为键类型和值类型提供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}

答案 1 :(得分:1)

KV可以是所有内容(Any)。由于您没有所有Convertor的东西,因此必须限制KV

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

现在,您需要为PairKeyPairValue及其所有子项提供转换器。

您可以在这里找到信息:spray-json#jsonprotocol