Scala 具有列表的泛型类型的JsonReader
我有以下域模型和JsonFormat/JsonReader定义:Scala 具有列表的泛型类型的JsonReader,scala,spray-json,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 ha
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定义:
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]
}
}
}
}
用于valueReader[T]
(用于类型为T的单个值)ValueResponse[T]
- 和
用于valueListReader[T]
(用于带有T类型值列表的响应)ValueListResponse[T]
T:JsonFormat
替换参数约束T:JsonReader
,它编译得很好
但是我想保留T:JsonReader
约束,而不是T:JsonFormat
,因为我的一些实体(T
)将只有reader实现
我怀疑我弄乱了参数定义的界限,但我不明白是怎么回事。我怀疑spray可能只对
JsonFormat[List[t]]
给定了JsonFormat[t]
,而不是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
s和JsonWriter
s,然后使用一个implicit def bothToFormat[t:JsonReader:JsonWriter]:JsonFormat[t]
,我怀疑spray可能只有JsonFormat[List[t]的隐式定义
给定一个JsonFormat[T]
,而不是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
s和JsonWriter
s,然后使用一个implicit def bothToFormat[t:JsonReader:JsonWriter]:JsonFormat[t]
谢谢你的回答,似乎是这样的。谢谢你的回答,似乎是这样。您是否尝试过添加导入默认JSONProtocol.\u
?是否尝试过添加导入默认JSONProtocol.\u
?