кодировщики / декодеры scala circe для абстрактного класса с классами case - PullRequest
0 голосов
/ 12 мая 2018

Я хочу сохранить коллекцию классов FieldMapping в виде строки json -

abstract class Field {
  def clazz: Class[_]

  def name: String
}

case class StringField(name: String) extends Field {
  override def clazz: Class[_] = classOf[String]
}

case class DateField(name: String) extends Field {
  override def clazz: Class[_] = classOf[Date]
}

... и т. Д. - полный код здесь: https://github.com/alexeyOnGitHub/scala-typesafe/blob/master/src/main/scala/com/example/model/Field.scala

Код Circe:

import com.example.model.{DateField, Field, FieldMapping, StringField}
import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder}
import io.circe.{Decoder, Encoder}

object CirceBoilerplateForConfigs {
  implicit val fieldDecoder: Decoder[StringField] = deriveDecoder[StringField]
  implicit val fieldEncoder: Encoder[StringField] = deriveEncoder[StringField]

  implicit val dateDecoder: Decoder[DateField] = deriveDecoder[DateField]
  implicit val dateEncoder: Encoder[DateField] = deriveEncoder[DateField]

  implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping]
  implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping]
}

Ошибка: (14, 65) не удалось найти неявное значение типа Lazy io.circe.generic.decoding.DerivedDecoder [com.example.model.FieldMapping] неявный val fooDecoder: Decoder [FieldMapping] = DeriveDecoder [FieldMapping] Ошибка: (14, 65)

Недостаточно аргументов для метода DerveDecoder: (неявное декодирование: shapeless.Lazy [io.circe.generic.decoding.DerivedDecoder [com.example.model.FieldMapping]]) io.circe.Decoder [com.example.model.FieldMapping]. Не указано значение параметра декодирования. неявный val fooDecoder: Декодер [FieldMapping] = производнаяDecoder [FieldMapping] Ошибка: (15, 65)

не удалось найти неявное значение типа Lazy io.circe.generic.encoding.DerivedObjectEncoder [com.example.model.FieldMapping] неявный val fooEncoder: Encoder [FieldMapping] = DerveEncoder [FieldMapping] Ошибка: (15, 65)

недостаточно аргументов для Метод DeriveEncoder: (неявное кодирование: shapeless.Lazy [io.circe.generic.encoding.DerivedObjectEncoder [com.example.model.FieldMapping]]) io.circe.ObjectEncoder [com.example.model.FieldMapping]. Не указано значение параметра закодировать. неявный val fooEncoder: Кодировщик [FieldMapping] = производноеEncoder [FieldMapping]

1 Ответ

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

Field должен быть запечатанной чертой (с абстрактным классом или не запечатанной чертой, это не будет работать).

Компилируется следующий код:

import java.util.Date

sealed trait Field {
  def clazz: Class[_]

  def name: String
}

case class StringField(name: String) extends Field {
  override def clazz: Class[_] = classOf[String]
}

case class DateField(name: String) extends Field {
  override def clazz: Class[_] = classOf[Date]
}

case class FieldMapping(fieldInConnector1: Option[Field],
                        fieldInConnector2: Option[Field],
                        selected: Boolean,
                        defaultValue: String)

import io.circe.generic.semiauto.{deriveDecoder, deriveEncoder}
import io.circe.{Decoder, Encoder}
object CirceBoilerplateForConfigs {
  implicit val stringDecoder: Decoder[StringField] = deriveDecoder[StringField]
  implicit val stringEncoder: Encoder[StringField] = deriveEncoder[StringField]

  implicit val dateDecoder: Decoder[DateField] = deriveDecoder[DateField]
  implicit val dateEncoder: Encoder[DateField] = deriveEncoder[DateField]

  implicit val fieldDecoder: Decoder[Field] = deriveDecoder[Field]
  implicit val fieldEncoder: Encoder[Field] = deriveEncoder[Field]

  implicit val fooDecoder: Decoder[FieldMapping] = deriveDecoder[FieldMapping]
  implicit val fooEncoder: Encoder[FieldMapping] = deriveEncoder[FieldMapping]
}
...