Circe - Как мне указать кодировщик для дополнительного типа? - PullRequest
0 голосов
/ 30 апреля 2018

Я сделал простую модификацию приведенного здесь примера: https://circe.github.io/circe/, добавив тип Основы. Почему это не работает?

import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._


class Basics(Name:String,Cached:Boolean)

sealed trait Foo
case class Bar(basics:Basics,xs: Vector[String]) extends Foo
case class Qux(basics:Basics,i: Int, d: Option[Double]) extends Foo

val foo: List[Foo] = List(Qux(new Basics("Cat",true),13, Some(14.0)),Bar(new Basics("Cat",true),Vector("cat")))
val json = foo.asJson.noSpaces
println(json)

val decodedFoo = decode[List[Foo]](json)
println(decodedFoo)

Я специально получаю:

ScalaFiddle.scala:11: error: could not find implicit value for parameter encoder: circe.this.Encoder[List[ScalaFiddle.this.Foo]]
val json = foo.asJson.noSpaces
               ^
ScalaFiddle.scala:11: error: not enough arguments for method asJson: (implicit  encoder: circe.this.Encoder[List[ScalaFiddle.this.Foo]])circe.this.Json.
Unspecified value parameter encoder.
val json = foo.asJson.noSpaces
               ^
ScalaFiddle.scala:14: error: could not find implicit value for evidence parameter of type circe.this.Decoder[List[ScalaFiddle.this.Foo]]
val decodedFoo = decode[List[Foo]](json)

Дополнительная магия:

sealed trait Bat
case class Basics(name:String,cached:Boolean) extends Bat

исправляет это. Почему?

Как и

 case class Basics(name:String,cached:Boolean)

1 Ответ

0 голосов
/ 01 мая 2018

Basics должно быть case class для автоматического извлечения декодера.

Circe основан на бесформенном автоматическом выводе, а бесформенная работа с классами case, а не с простыми классами.

Как правило, в Scala, если ваш класс представляет какую-то запись / данные, используйте класс прецедентов.

...