如何在 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 的编解码器放在较低优先级的上下文中)。我不知道为什么没有首先找到相同上下文中的编解码器。
假设我有一个
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 的编解码器放在较低优先级的上下文中)。我不知道为什么没有首先找到相同上下文中的编解码器。