【问题标题】:Scala Circe. Encoder type Any斯卡拉瑟。编码器类型 任意
【发布时间】:2020-12-15 00:39:43
【问题描述】:

我正在尝试将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, m, d.toString)
        }
}

我得到一个错误找不到参数编码器的隐含值:Encoder[Any]

这是我的完整代码

import io.circe.Encoder
import io.circe.generic.auto._
import io.circe.syntax._

object a {
  case class ResponseResult (var Code : Int,
                             var Message: String,
                             var Data: Any )
  object ResponseResult {
    implicit val encodeResult: Encoder[ResponseResult] =
      Encoder .forProduct3[ResponseResult, Int, String, Any]("Code", "Message", "Data") {
        case ResponseResult(c, m, d) => (c, m, d.toString)
      }
  }

  def main(args: Array[String]): Unit = {
    var json = ResponseResult(1, "2", List(3,4,5)).asJson
  }
}

任何人都可以告诉我如何编码class ResponseResult。 谢谢

【问题讨论】:

  • 你没有理由在这里使用vars。

标签: json scala circe


【解决方案1】:

好吧,你不能有 Any 类型的 Codec,就这么简单。

如果你想在那里传递一些值,序列化它并能够在以后反序列化它,你必须假设某种类型。你可以通过使用类型参数来推迟这个假设:

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, m, 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

【讨论】:

    【解决方案2】:

    其实Data可以使用Json类型。

    case class ResponseResult (var Code : Int,
                     var Message: String,
                     var Data: io.circe.Json )
    

    因此您可以将任何内容传递给 Data,也可以为 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多