Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 自动派生所有类型的已配置编解码器_Json_Scala_Circe - Fatal编程技术网

Json 自动派生所有类型的已配置编解码器

Json 自动派生所有类型的已配置编解码器,json,scala,circe,Json,Scala,Circe,我目前使用已配置的编解码器将json解码为案例类。看起来像 import io.circe.{Decoder, Encoder} import io.circe.generic.AutoDerivation import io.circe.generic.extras.Configuration import io.circe.generic.extras.decoding.ConfiguredDecoder import io.circe.generic.extras.semiauto._ i

我目前使用已配置的编解码器将json解码为案例类。看起来像

import io.circe.{Decoder, Encoder}
import io.circe.generic.AutoDerivation
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.decoding.ConfiguredDecoder
import io.circe.generic.extras.semiauto._
import shapeless.Lazy

final case class A(...)
final case class B(...)
final case class C(...)

object Cdcs extends AutoDerivation {
  implicit def configuration: Configuration = Configuration.default.withSnakeCaseMemberNames

  implicit def aDecoder: Decoder[A] = deriveConfiguredDecoder[A]
  implicit def bDecoder: Decoder[B] = deriveConfiguredDecoder[B]
  implicit def cDecoder: Encoder[C] = deriveConfiguredEncoder[C]
}
问题是,当添加新实体时,很容易忘记添加编解码器(我刚刚添加过)。所以我很好奇如何自动配置解码器派生。我试过了

import io.circe.{Decoder, Encoder}
import io.circe.generic.AutoDerivation
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.decoding.ConfiguredDecoder
import io.circe.generic.extras.semiauto._
import shapeless.Lazy

object Cdcs extends AutoDerivation {
  implicit def configuration: Configuration = Configuration.default.withSnakeCaseMemberNames
  implicit def configuredDecoder[Entity: Decoder](implicit
      decode: Lazy[ConfiguredDecoder[Entity]]
  ): Decoder[Entity] =
    deriveConfiguredDecoder[Entity]

}

但在这种情况下,生成并应用未配置的解码器。有没有办法自动生成这样的
解码器
?也许一些宏在这里会有帮助?

目前,您使用的是半自动,您可以切换到circe默认提供的自动派生。我会简单地使用单元测试来检查所有公开模型的序列化格式——若测试无法编译,我就忘了编解码器。Auto的缺点是,同一个编解码器会在每个呼叫站点上多次派生,并且如果您使用某些自定义项并在某些范围内导入失败,则会产生不匹配的编解码器。目前,您使用的是semiauto,而您可以切换到circe默认提供的自动派生。我会简单地使用单元测试来检查所有公开模型的序列化格式——若测试无法编译,我就忘了编解码器。Auto的缺点是,同一个编解码器将在每个呼叫站点上多次派生,并且如果您使用某些自定义,并且无法在某个范围内导入它,则会产生不匹配的编解码器。