具有案例类的抽象类的 scala circe 编码器/解码器

Ale*_*lex 5 scala circe

我想将 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]
}
Run Code Online (Sandbox Code Playgroud)

...等 - 完整代码在这里: https://github.com/alexeyOnGitHub/scala-typesafe/blob/master/src/main/scala/com/example/model/Field.scala

瑟茜代码:

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]
}
Run Code Online (Sandbox Code Playgroud)

错误:(14, 65) 找不到 io.circe.generic.decoding.DerivedDecoder[com.example.model.FieldMapping] 隐式 val fooDecoder 类型的惰性隐式值:Decoder[FieldMapping] =deriveDecoder[FieldMapping] 错误:(14 , 65)

方法deriveDecoder没有足够的参数:(隐式解码:shapeless.Lazy[io.circe.generic.decoding.DerivedDecoder[com.example.model.FieldMapping]])io.circe.Decoder[com.example.model.FieldMapping]。未指定值参数解码。隐式 val fooDecoder: 解码器 [FieldMapping] =deriveDecoder[FieldMapping] 错误:(15, 65)

找不到 io.circe.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMapping] 隐式 val fooEncoder 类型的惰性隐式值:Encoder[FieldMapping] =deriveEncoder[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] =deriveEncoder[FieldMapping]

Dmy*_*tin 4

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]
}
Run Code Online (Sandbox Code Playgroud)