如何在 argonaut.io 中进行递归编解码器?

How to do recursive codecs in argonaut.io?

假设我有一个

class FooCodecs[A : CodecJson] { 

  def ListCodec: CodecJson[List[A]] = 
    CodecJson.derived[IList](_.toList)(IList.fromList)
}

如何创建支持任意嵌套数量的 List 的编解码器,例如 List[List[List[A]]

我试过为 List[T[_] : CodecJson] 提供编解码器,但很明显它遗漏了一些对 A 的重要类型引用。

那么,如何使它递归呢?

如果 List 有一个编解码器(它似乎是由 traversableOnce 实例提供的)和 A 的编解码器,那么任何 Lists 和 A 的嵌套都可以工作。不需要明确的递归定义:

import argonaut._
import Argonaut._

val a = List(List(List(1,2,3),List(4,5,6))).asJson
a.toString.decodeOption[List[List[List[Int]]]]

是的,正如@melps 所写,这按预期工作。我的问题似乎是 implicit CodecJson[A] 在提供的任何编解码器之前都找不到。我不得不将编解码器移动到相应的伴随对象(或者我可以将 Argonaut 的编解码器放在较低优先级的上下文中)。我不知道为什么没有首先找到相同上下文中的编解码器。