当前位置: 首页 > 知识库问答 >
问题:

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

子车凯泽
2023-03-14

我想将FieldMmap类的集合保存为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-完整代码: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)找不到io类型的延迟隐式值。circe。通用的解码。DerivedDecoder[com.example.model.FieldMapping]隐式val-fooDecoder:Decoder[FieldMapping]=DerivedDecoder[FieldMapping]错误:(14,65)

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

找不到io类型的惰性隐式值。circe。通用的编码。DerivedObjectEncoder[com.example.model.FieldMapping]隐式val fooEncoder:Encoder[FieldMapping]=deriveEncoder[FieldMapping]错误:(15,65)

方法派生的参数不够Encoder:(隐式编码:无形状。Lazy[io.circe.generic.encoding.DerivedObjectEncoder[com.example.model.FieldMap]])io.circe.ObjectEncoder[com.example.model.FieldMap]。未指定值参数编码。隐式val foEncoder: Encoder[FieldMap]=派生编码器[FieldMap]

共有1个答案

龙宣
2023-03-14

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

以下代码编译:

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

 类似资料:
  • 虽然我们一直把解码器和编码器作为不同的实体来讨论,但你有时可能会发现把入站和出站的数据和信息转换都放在同一个类中更实用。Netty的抽象编解码器类就是用于这个目的,他们把一些成对的解码器和编码器组合在一起,以此来提供对于字节和消息都相同的操作。(这些类实现了 ChannelInboundHandler 和 ChannelOutboundHandler )。 您可能想知道是否有时候使用单独的解码器和

  • 我有一个案例类如下: 简单地说,我试图将Json解码为list[Road]。 我试图解码的Json是: 是基本枚举: 我已经为交通灯建立了编码器和解码器: 我还为map[String,String]类型构建了一个编码器: 最后,道路案例类的编码器和解码器: 现在,我试图将json解析为。 但是我不能解码它--由于方法中的“else”,我总是得到一个空列表,没有任何错误。 我做错了什么?提前谢了。

  • scala-mongo-driver有一个处理case类的很好的文档。http://mongodb.github.io/mongo-scala-driver/2.3/getting-start/quick-tour-case-classs/。在当前情况下,我的case类字段是option[T]值。因此值可以是或。默认编解码器现在将“none”值序列化为null。但如果键的值为none,我想排除它。

  • 我正在为一个CS项目做一个游戏,其中一个要求是只有一个扫描仪为人类输入。如果我创建一个抽象类“Player”,它有一个扫描器对象,并创建两个扩展“Player”的“人类”类,它们是各自有自己的扫描器,还是共享“Player”扫描器?另外,当我结束游戏时如何关闭扫描仪?

  • 大家好,我正在尝试使用Dagger-Hilt,我想知道如何实现这个代码? Gradle返回此错误: 这是生成的Java类: 非常感谢您的帮助。