问题描述
我正在尝试将class ResponseResult
编码为json
case class ResponseResult (var Code : Int,var Message: String,var Data: Any )
var json = ResponseResult(1,"2",List(3,4,5)).asJson
我收到错误消息找不到参数编码器的隐式值:io.circe.Encoder [ResponseResult]
然后我创建编码器
object ResponseResult {
implicit val encodeResult: Encoder[ResponseResult] =
Encoder.forProduct3[ResponseResult,Int,String,Any]("Code","Message","Data") {
case ResponseResult(c,m,d) => (c,d.toString)
}
}
我收到错误消息找不到参数编码器的隐式值:编码器[任何]
这是我的完整代码
import io.circe.Encoder
import io.circe.generic.auto._
import io.circe.syntax._
object a {
case class ResponseResult (var Code : Int,var Data: Any )
object ResponseResult {
implicit val encodeResult: Encoder[ResponseResult] =
Encoder .forProduct3[ResponseResult,"Data") {
case ResponseResult(c,d.toString)
}
}
def main(args: Array[String]): Unit = {
var json = ResponseResult(1,5)).asJson
}
}
任何人都可以告诉我如何编码class ResponseResult
。
谢谢
解决方法
那么,就没有Any
类型的编解码器了。
如果要在此处传递一些值,对其进行序列化并在以后可以反序列化,则必须采用某种类型。您可以使用类型参数来推迟此假设:
case class ResponseResult[Data](Code : Int,Message: String,Data: Data)
,并且需要使用此类型参数的编码器:
object ResponseResult {
implicit def encodeResult[Data: Encoder]: Encoder[ResponseResult[Data]] =
Encoder.forProduct3[ResponseResult[Data],Int,String,Data]("Code","Message","Data") {
case ResponseResult(c,m,d) => (c,d)
}
}
然后您将能够根据需要序列化数据
// inferred to ResponseResult[List[Int]]
val response = ResponseResult(1,"2",List(3,4,5))
// and Circe can generate codec for List[Int] automatically
// so it can now generate codec for ResponseResult[List[Int]]
val json = response.asJson
,
实际上,您可以将 Json 类型用于数据。
case class ResponseResult (var Code : Int,var Message: String,var Data: io.circe.Json )
因此您可以将任何内容传递给 Data,也可以为 null。