次のケースクラスをエンコード/デコードしようとしています
case class Person(name: String, age: Int, childs: List[Person])
次のコードを使用します。
object Person {
implicit def PersonCodecJson =
casecodec3(Person.apply, Person.unapply)("name", "age", "childs")
}
Arrnaut を使用していますが、次のコンパイラ エラーが発生します。
could not find implicit value for evidence parameter of type argonaut.EncodeJson[List[Person]]
明らかに、コンパイラは List[Person] のエンコーディングを処理する方法を認識していません。これは、Person のエンコード方法の定義内で使用されているためです。
正しい方法でエンコードする方法をアルゴナウトに伝える賢い方法はありますか?
更新: Travis に感謝: 現在コンパイル中ですが、動作していません。
implicit def PersonCodecJson : CodecJson[Person] =
casecodec3(Person.apply, Person.unapply)("name", "age", "childs")
無限再帰とデコードしようとするスタックオーバーフローにつながります
val input = """
[{"name": "parent1", "age": 31, "childs": [{"name": "child1", "age": 2, "childs": []}]},
{"name": "parent2", "age": 29, "childs": []}
]
"""
val persons = input.decodeOption[List[Person]].getOrElse(Nil)
結果は
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
at Person$.PersonCodecJson(main.scala:8)
[debug] Thread run-main-1 exited.
[debug] Interrupting remaining threads (should be all daemons).
[debug] Sandboxed run complete..
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1653)
at sbt.BuildCommon$$anonfun$toError$1.apply(Defaults.scala:1653)
at scala.Option.foreach(Option.scala:236)
at sbt.BuildCommon$class.toError(Defaults.scala:1653)
at sbt.Defaults$.toError(Defaults.scala:35)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:656)
at sbt.Defaults$$anonfun$runTask$1$$anonfun$apply$36$$anonfun$apply$37.apply(Defaults.scala:654)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
at sbt.std.Transform$$anon$4.work(System.scala:64)
このネストされたjsonをデコードするこのアプローチは有効ですか? まったく違うことに取り組む必要がありますか?それとも、別の小さなコードが欠落しているだけですか?