带有 List 的通用类型的 JsonReader

JsonReader for generic type with List

我有以下域模型和 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 定义:

Reader 两种类型的定义几乎相同。 第一个定义工作正常,但第二个编译器因错误而失败。

找不到 List[T]

的 JsonReader 或 JsonFormat 类型 class

有趣的是,如果我将参数约束 T: JsonReader 替换为 T: JsonFormat,它可以正常编译。

但我想保留 T: JsonReader 约束而不是 T: JsonFormat,因为我的一些实体 (T) 将只有 reader 实现。

我怀疑我弄乱了参数定义的界限,但我不明白是怎么回事。

我怀疑在给定 JsonFormat[T] 的情况下,spray 可能只有 JsonFormat[List[T]] 的隐式定义,而不是给定 JsonReader[T]JsonReader[List[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)
  }
}

这实际上让我想知道为什么他们不单独定义所有隐式 JsonReaders 和 JsonWriters 然后有一个 implicit def bothToFormat[T : JsonReader : JsonWriter]: JsonFormat[T]