scala - 使用Scala argonaut编码嵌套类

标签 scala argonaut

我正在尝试对以下案例类进行编码/解码

case class Person(name: String, age: Int, childs: List[Person])

使用以下代码:
object Person {
    implicit def PersonCodecJson =
        casecodec3(Person.apply, Person.unapply)("name", "age", "childs")

}

argonaut,但出现以下编译器错误:
could not find implicit value for evidence parameter of type argonaut.EncodeJson[List[Person]]

显然,编译器不知道如何处理List [Person]的编码,因为它在定义如何对Person进行编码的内部使用。

有什么聪明的方法告诉argonaut如何正确编码?

更新:感谢Travis:现在正在编译,但是无法正常工作。
implicit def PersonCodecJson : CodecJson[Person] =
        casecodec3(Person.apply, Person.unapply)("name", "age", "childs")

导致无限递归和尝试解码的堆栈溢出
val input = """
    [{"name": "parent1", "age": 31, "childs": [{"name": "child1", "age": 2, "childs": []}]},
     {"name": "parent2", "age": 29, "childs": []}
    ]
    """
val persons = input.decodeOption[List[Person]].getOrElse(Nil)

结果是
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
[debug]     Thread run-main-1 exited.
[debug] Interrupting remaining threads (should be all daemons).
[debug] Sandboxed run complete..
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1653)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1653)
at scala.Option.foreach(Option.scala:236)
at sbt.BuildCommon$class.toError(Defaults.scala:1653)
at sbt.Defaults$.toError(Defaults.scala:35)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:656)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:654)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
at sbt.std.Transform$$anon$4.work(System.scala:64)

这种解码此嵌套json的方法是否有效?我必须解决完全不同的问题吗?还是只是缺少一小段代码?

最佳答案

您非常接近-您只需要明确指定类型:

object Person {
  implicit def PersonCodecJson: CodecJson[Person] =
    casecodec3(Person.apply, Person.unapply)("name", "age", "childs")
}

正如Scala不允许您在没有显式结果类型的情况下编写递归方法一样,它也不会在没有一个隐式结果类型的情况下在定义内找到隐式定义。

不知道这有多聪明,但它能奏效。

关于scala - 使用Scala argonaut编码嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22675722/

相关文章:

scala - 一元约束到可变参数的 HList

java - Play framework 2.2.0 不会自动生成 getter/setter

Scala 无法处理巨大的对象?

json - 在Scala中,如何对集合的子类型应用隐式转换?

json - 使用 Argonaut 创建通用 JSON 转换器

json - Argonaut-在自定义解码器中返回错误

json - 收集 JSON 数组中的元素

scala - 为具有 transient scala 依赖的 spring-xd 项目优化 gradle

java - Scala Option.orElse 等效于 Java Optional