我具有以下域模型和JsonFormat / JsonReader定义:
import spray.json._
case class User(name: String)
case class ValueResponse[T](value: T)
case class ValueListResponse[T](values: List[T])
object ApiProtocol extends DefaultJsonProtocol {
// some of my entities have JsonFormat but some only JsonReader
implicit val userFormat = jsonFormat1[String, User](User)
implicit def valueReader[T : JsonReader] = new JsonReader[ValueResponse[T]] {
def read(value: JsValue): ValueResponse[T] = {
value.asJsObject.fields.get("value") match {
case Some(value: JsObject) => ValueResponse(value.convertTo[T])
}
}
}
implicit def valueListReader[T : JsonReader] = new JsonReader[ValueListResponse[T]] {
def read(value: JsValue): ValueListResponse[T] = {
value.asJsObject.fields.get("values") match {
case Some(values: JsArray) => ValueListResponse(values.convertTo[List[T]])
^
[error] Cannot find JsonReader or JsonFormat type class for List[T]
}
}
}
}
我有两个隐式的JsonReader定义:
valueReader[T]
的{{1}}(用于T类型的单个值)ValueResponse[T]
的{{1}}(用于响应,并带有类型T值的列表)两种类型的阅读器定义几乎相同。 第一个定义工作正常,但第二个编译器因错误而失败。
找不到List [T]的JsonReader或JsonFormat类型类
有趣的是,如果我将参数约束valueListReader[T]
替换为ValueListResponse[T]
,则会编译良好。
但是我想保留T: JsonReader
约束而不是T: JsonFormat
,因为我的某些实体(T: JsonReader
)将只有阅读器实现。
我怀疑我搞砸了参数定义的范围,但是我不知道怎么做。
答案 0 :(得分:2)
我怀疑喷雾可能仅对给定JsonFormat[List[T]]
的{{1}}有一个隐式定义,而不给给定JsonFormat[T]
的{{1}}。幸运的是,这很容易做,就像这样:
JsonReader[List[T]]
这实际上使我感到奇怪,为什么他们不只是分别定义其所有隐式JsonReader[T]
和implicit def listReader[T : JsonReader]: JsonReader[List[T]] = new JsonReader[List[T]] {
def read(value: JsValue): List[T] = value match {
case JsArray(elements) => elements.map(_.convertTo[T]).toList
case x => deserializationError("Expected List as JsArray, but got " + x)
}
}
,然后才有一个JsonReader