json - 使用 circe 编码为 JSON 时出现 StackOverflowError

标签 json scala stack-overflow encoder circe

我正在为我的案例类编写测试,在以下测试中我遇到了 StackOverflowError:

  test("ValuationRequest - Conversion between case object and Json works") {
    val caseObject = ValuationRequest(TIME_SERIES_INTRADAY, "", IntraDayIntervals.MIN_5)
    val jsonString = caseObject
      .asJson
      .printWith(Printer.noSpaces)

    decode[ValuationRequest](jsonString) must be(Right(caseObject))
  }

这是堆栈跟踪:

An exception or error caused a run to abort. 
java.lang.StackOverflowError
    at io.circe.syntax.package$EncoderOps$.asJson$extension(package.scala:10)
    at eventbus.ValuationRequest$.$anonfun$encodeRequest$1(ValuationRequestCases.scala:14)
....

这是案例代码:

import AV_Enums.TimeSeriesFunctions.TIME_SERIES_INTRADAY
import AV_Enums.{IntraDayInterval, IntraDayIntervals, TimeSeriesType}
import cats.syntax.functor._
import io.circe.generic.auto._
import io.circe.generic.semiauto._
import io.circe.syntax._
import io.circe.{Decoder, Encoder}

case class ValuationRequest(function: TimeSeriesType = TIME_SERIES_INTRADAY, symbol: String, interval: IntraDayInterval = IntraDayIntervals.MIN_5)

object ValuationRequest {
  implicit val encodeRequest: Encoder[ValuationRequest] = Encoder.instance { case response@ValuationRequest(_, _, _) => response.asJson }
  implicit val decodeRequest: Decoder[ValuationRequest] = deriveDecoder[ValuationRequest].widen
}

这些是它使用的枚举:

sealed abstract class TimeSeriesType(val text: String) extends EnumEntry {}

sealed abstract class IntraDayInterval(val text: String) extends EnumEntry {}

object TimeSeriesFunctions extends Enum[TimeSeriesType] with CirceEnum[TimeSeriesType] {
  val values: immutable.IndexedSeq[TimeSeriesType] = findValues

  case object TIME_SERIES_INTRADAY extends TimeSeriesType("TIME_SERIES_INTRADAY")

  case object TIME_SERIES_DAILY extends TimeSeriesType("TIME_SERIES_DAILY")

  case object TIME_SERIES_WEEKLY extends TimeSeriesType("TIME_SERIES_WEEKLY")

  case object TIME_SERIES_MONTHLY extends TimeSeriesType("TIME_SERIES_MONTHLY")

}

object IntraDayIntervals extends Enum[IntraDayInterval] with CirceEnum[IntraDayInterval] {
  val values: immutable.IndexedSeq[IntraDayInterval] = findValues

  case object MIN_1 extends IntraDayInterval("1min")

  case object MIN_5 extends IntraDayInterval("5min")

  case object MIN_15 extends IntraDayInterval("15min")

  case object MIN_30 extends IntraDayInterval("30min")

  case object MIN_60 extends IntraDayInterval("60min")

}

我不明白这个案例是怎么回事,其他所有案例都工作正常并且以相同的方式实现。有人可以帮忙吗?

最佳答案

有问题的线路

Encoder.instance { case response@ValuationRequest(_, _, _) => response.asJson }

.asJson 这里需要 Encoder[ValuationRequest] 这是一个递归调用。您无法使用 deriveEncoder[ValuationRequest] 的任何原因?

关于json - 使用 circe 编码为 JSON 时出现 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60873677/

相关文章:

Android:第一个 http 响应总是需要更长的时间(即使没有保持 Activity 状态)

javascript - JSON 与多个连接

json - 将来自多个单元格的数据合并到一个 JSON 对象中

java - Play 2.0 框架 - 自定义表单域

java - 为什么我收到 Ja.lang.StackOverflowError

python - Jinja2 和 Json

java - 你能分享一个 URL 解析实现的链接吗?

eclipse - 如何在 sbt、Eclipse 和 github 中初始化一个新的 Scala 项目

java - 定义包含 main() 方法的同一类的实例变量时出现 StackOverflowError

java - 当数组变得太大时 Stackoverflow