带有case类的抽象类的scala circe编码器/解码器

带有case类的抽象类的scala circe编码器/解码器,scala,circe,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 Fie

我想将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]
}
。。。etc-此处的完整代码:

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)找不到类型为的惰性隐式值 io.circe.generic.decoding.DerivedDecoder[com.example.model.FieldMapping] 隐式val FoodDecoder:解码器[字段映射]= deriveDecoder[FieldMapping]错误:(14,65)

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

找不到类型为的惰性隐式值 io.circe.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMapping] 隐式val fooEncoder:编码器[字段映射]= deriveEncoder[FieldMapping]错误:(15,65)

没有足够的论据支持 方法deriveEncoder:(隐式编码: shapeless.Lazy[io.circ.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMapping]])io.circ.ObjectEncoder[com.example.model.FieldMapping]。 未指定的值参数编码。隐式val编码器: 编码器[FieldMapping]=deriveEncoder[FieldMapping]


字段
应为密封特征(对于抽象类或非密封特征,这将不起作用)

编译以下代码:

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]
}

在您的要点中,您没有为
GUser
提供代码
字段映射
也没有定义。如果我注释掉
case class GUserField
def user
导入com.example.model…
隐式val-fooDecoder>,
implicit val foocoder
一切都会编译。下面是代码的其余部分-我需要用于FieldMapping集合的编码器/解码器,因为这是我想要转换为json字符串的内容