具有列表

时间:2018-07-13 19:33:26

标签: scala spray-json

我具有以下域模型和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)将只有阅读器实现。

我怀疑我搞砸了参数定义的范围,但是我不知道怎么做。

1 个答案:

答案 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