特征的隐式 JsonWriter 不起作用
Implicit JsonWriter for trait not working
我有class如下
trait RiskCheckStatusCode {
def code: String
def isSuccess: Boolean
}
object RiskCheckStatusCode {
val SUCCESS = SuccessRiskCheckStatusCode("1.1.1")
val FAIL = FailRiskCheckStatusCode("2.2.2")
case class SuccessRiskCheckStatusCode(code: String) extends RiskCheckStatusCode {
override def isSuccess = true
}
object SuccessRiskCheckStatusCode {
import spray.json.DefaultJsonProtocol._
implicit val formatter = jsonFormat1(SuccessRiskCheckStatusCode.apply)
}
case class FailRiskCheckStatusCode(code: String) extends RiskCheckStatusCode {
override def isSuccess = false
}
object FailRiskCheckStatusCode {
import spray.json.DefaultJsonProtocol._
implicit val formatter = jsonFormat1(FailRiskCheckStatusCode.apply)
}
}
现在我想将 RiskCheckStatusCode 列表转换为 json
object Main extends App{
import spray.json._
import spray.json.DefaultJsonProtocol._
val l = List(RiskCheckStatusCode.SUCCESS, RiskCheckStatusCode.FAIL)
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[RiskCheckStatusCode] {
override def write(obj: RiskCheckStatusCode): JsValue = obj match {
case obj: SuccessRiskCheckStatusCode => obj.toJson
case obj: FailRiskCheckStatusCode => obj.toJson
}
}
def json[T](list: T)(implicit formatter: JsonWriter[T]) = {
print(list.toJson)
}
json(l)
}
但是 json 方法找不到 jsonWriter[RiskCheckStatusCode]。
你能解释为什么吗?也许我应该对特征类型做不同的处理?
编辑:
它适用于
val l: RiskCheckStatusCode = RiskCheckStatusCode.SUCCESS
所以问题出在 List[RiskCheckStatusCode] 上,因为我有一个用于 RiskCheckStatusCode 的格式化程序,而不是用于 List[RiskCheckStatusCode] 的格式化程序。我试过 import DefaultJsonProtocol 但它仍然不起作用。
import spray.json.DefaultJsonProtocol._
我必须更改定义?来自
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[RiskCheckStatusCode]
到
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[List[RiskCheckStatusCode]]
错误:
Error:(28, 7) Cannot find JsonWriter or JsonFormat type class for List[com.example.status.RiskCheckStatusCode]
json(l)
Error:(28, 7) not enough arguments for method json: (implicit formatter: spray.json.JsonWriter[List[com.example.status.RiskCheckStatusCode]])Unit.
Unspecified value parameter formatter.
json(l)
您的代码很好,只是您的范围内没有 toJson
(它位于 spray.json
的包对象中)。
添加它,您的代码应该可以编译:
object Main extends App with DefaultJsonProtocol {
import spray.json._
// ...
}
此外,spray 在通过派生格式提升 JsonWriter
方面存在一些问题(有关详细信息,请参阅 this)。
您可以改用 JsonFormat
:
implicit object RiskCheckStatusCodeJsonFormat extends JsonFormat[RiskCheckStatusCode] {
override def write(obj: RiskCheckStatusCode): JsValue = obj match {
case obj: SuccessRiskCheckStatusCode => obj.toJson
case obj: FailRiskCheckStatusCode => obj.toJson
}
override def read(json: JsValue): RiskCheckStatusCode = ???
}
此外,要清理 List
的类型,请将 RiskCheckStatusCode
的定义更改为( 解释更多细节):
sealed trait RiskCheckStatusCode extends Serializable with Product
我有class如下
trait RiskCheckStatusCode {
def code: String
def isSuccess: Boolean
}
object RiskCheckStatusCode {
val SUCCESS = SuccessRiskCheckStatusCode("1.1.1")
val FAIL = FailRiskCheckStatusCode("2.2.2")
case class SuccessRiskCheckStatusCode(code: String) extends RiskCheckStatusCode {
override def isSuccess = true
}
object SuccessRiskCheckStatusCode {
import spray.json.DefaultJsonProtocol._
implicit val formatter = jsonFormat1(SuccessRiskCheckStatusCode.apply)
}
case class FailRiskCheckStatusCode(code: String) extends RiskCheckStatusCode {
override def isSuccess = false
}
object FailRiskCheckStatusCode {
import spray.json.DefaultJsonProtocol._
implicit val formatter = jsonFormat1(FailRiskCheckStatusCode.apply)
}
}
现在我想将 RiskCheckStatusCode 列表转换为 json
object Main extends App{
import spray.json._
import spray.json.DefaultJsonProtocol._
val l = List(RiskCheckStatusCode.SUCCESS, RiskCheckStatusCode.FAIL)
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[RiskCheckStatusCode] {
override def write(obj: RiskCheckStatusCode): JsValue = obj match {
case obj: SuccessRiskCheckStatusCode => obj.toJson
case obj: FailRiskCheckStatusCode => obj.toJson
}
}
def json[T](list: T)(implicit formatter: JsonWriter[T]) = {
print(list.toJson)
}
json(l)
}
但是 json 方法找不到 jsonWriter[RiskCheckStatusCode]。 你能解释为什么吗?也许我应该对特征类型做不同的处理?
编辑: 它适用于
val l: RiskCheckStatusCode = RiskCheckStatusCode.SUCCESS
所以问题出在 List[RiskCheckStatusCode] 上,因为我有一个用于 RiskCheckStatusCode 的格式化程序,而不是用于 List[RiskCheckStatusCode] 的格式化程序。我试过 import DefaultJsonProtocol 但它仍然不起作用。
import spray.json.DefaultJsonProtocol._
我必须更改定义?来自
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[RiskCheckStatusCode]
到
implicit object RiskCheckStatusCodeJsonFormat extends JsonWriter[List[RiskCheckStatusCode]]
错误:
Error:(28, 7) Cannot find JsonWriter or JsonFormat type class for List[com.example.status.RiskCheckStatusCode]
json(l)
Error:(28, 7) not enough arguments for method json: (implicit formatter: spray.json.JsonWriter[List[com.example.status.RiskCheckStatusCode]])Unit.
Unspecified value parameter formatter.
json(l)
您的代码很好,只是您的范围内没有 toJson
(它位于 spray.json
的包对象中)。
添加它,您的代码应该可以编译:
object Main extends App with DefaultJsonProtocol {
import spray.json._
// ...
}
此外,spray 在通过派生格式提升 JsonWriter
方面存在一些问题(有关详细信息,请参阅 this)。
您可以改用 JsonFormat
:
implicit object RiskCheckStatusCodeJsonFormat extends JsonFormat[RiskCheckStatusCode] {
override def write(obj: RiskCheckStatusCode): JsValue = obj match {
case obj: SuccessRiskCheckStatusCode => obj.toJson
case obj: FailRiskCheckStatusCode => obj.toJson
}
override def read(json: JsValue): RiskCheckStatusCode = ???
}
此外,要清理 List
的类型,请将 RiskCheckStatusCode
的定义更改为(
sealed trait RiskCheckStatusCode extends Serializable with Product