我使用 ArgonautShapeless 来定义一些 json 编解码器。
当我为我的编解码器提供类型时,我得到了 StackOverflowError,但如果我关闭类型,它就可以工作。如何提供类型?
我对这个问题的理解是,隐式查找def of[A: DecodeJson] = implicitly[DecodeJson[A]]
在同一行上找到了我的定义implicit def fooCodec: DecodeJson[Foo]
,因此是递归的,所以会中断。
还有其他方法可以让我提供类型吗?理想情况下,我希望在我的项目中有一个对象,我在其中定义所有代码,并且它们可能相互依赖。
import $ivy.`com.github.alexarchambault::argonaut-shapeless_6.2:1.2.0-M4`
import argonaut._, Argonaut._
case class Foo(a: Int)
object SomeCodecs {
import ArgonautShapeless._
// this doesnt work
implicit def fooCodec: DecodeJson[Foo] = DecodeJson.of[Foo]
}
import SomeCodecs._
"""{"a":1}""".decode[Foo]
java.lang.StackOverflowError
ammonite.$sess.cmd3$SomeCodecs$.fooCodec(cmd3.sc:3)
如果我关闭类型,它会起作用。
object SomeCodecs {
import ArgonautShapeless._
// this works
implicit def fooCodec = DecodeJson.of[Foo]
}
import SomeCodecs._
"""{"a":1}""".decode[Foo]
res4: Either[Either[String, (String, CursorHistory)], Foo] = Right(Foo(1))
谢谢