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

时间:2015-10-14 06:51:15

标签: json scala recursion scalaz 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的一些重要类型引用。

那么,我如何使其递归?

2 个答案:

答案 0 :(得分:1)

如果有一个Codec for 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]]]]

答案 1 :(得分:0)

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