带有 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 定义:
valueReader[T]
for ValueResponse[T]
(对于类型 T 的单个值)
- and
valueListReader[T]
for ValueListResponse[T]
(对于带有类型 T 值列表的响应)
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)
}
}
这实际上让我想知道为什么他们不单独定义所有隐式 JsonReader
s 和 JsonWriter
s 然后有一个 implicit def bothToFormat[T : JsonReader : JsonWriter]: JsonFormat[T]
我有以下域模型和 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]
forValueResponse[T]
(对于类型 T 的单个值)- and
valueListReader[T]
forValueListResponse[T]
(对于带有类型 T 值列表的响应)
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)
}
}
这实际上让我想知道为什么他们不单独定义所有隐式 JsonReader
s 和 JsonWriter
s 然后有一个 implicit def bothToFormat[T : JsonReader : JsonWriter]: JsonFormat[T]