2015-10-14 3 views
2

позволяет сказать, что у меня естьКак сделать рекурсивные кодеки в 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.

Итак, как я могу сделать это рекурсивным?

ответ

1

Если есть Codec for List (и, кажется, он предоставлен экземпляром 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 в контексте с более низким приоритетом). Я не знаю, почему кодеки в тех же контекстах не были найдены в первую очередь.