2015-10-14 47 views
2

可以说我有一个如何在argonaut.io中执行递归编解码器?

class FooCodecs[A : CodecJson] { 

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

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

我试过提供一个编解码器List[T[_] : CodecJson],但它很明显,它没有涉及到一些重要的类型A

那么,如何让它递归?

回答

1

如果存在列表的编解码器(它似乎是由traversableOnce实例提供的)和A的编解码器,则任何列表和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]]]] 
0

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