使用@ConfiguredJsonCodec时添加额外构造函数报错,求解决方法
解决Circe配置式编解码器在带辅助构造函数的Case类上的编译错误
我之前碰到过类似的问题,给你两个实用的修复方案:
问题原因
当你给Foo这个case类添加无参辅助构造函数后,Circe的@ConfiguredJsonCodec注解触发的宏生成逻辑会被干扰——它没法正确识别case类的主构造参数,导致无法自动生成ConfiguredDecoder实例,最终抛出编译错误。
方案一:手动生成编解码器(推荐)
去掉case类上的注解,转而在伴生对象里手动调用Circe的推导方法生成编解码器,这样能绕过宏的识别问题:
import io.circe.generic.extras.{Configuration, deriveConfiguredDecoder, deriveConfiguredEncoder} import io.circe.generic.extras.decoding.ConfiguredDecoder import io.circe.generic.extras.encoding.ConfiguredEncoder case class Foo(firstName: String) { // 保留你的无参辅助构造函数 def this() = this("") } object Foo { // 蛇形命名配置保持不变 implicit val snakeConfiguration: Configuration = Configuration.default.withSnakeCaseMemberNames // 手动推导解码器和编码器 implicit val fooDecoder: ConfiguredDecoder[Foo] = deriveConfiguredDecoder[Foo] implicit val fooEncoder: ConfiguredEncoder[Foo] = deriveConfiguredEncoder[Foo] }
测试解析逻辑,依然能正常工作:
import io.circe.parser.decode val json = """{"first_name":"Bob"}""" val result = decode[Foo](json) // 结果为 Right(Foo("Bob"))
方案二:调整注解位置
如果你更倾向于保留注解写法,可以把@ConfiguredJsonCodec从case类移到它的伴生对象上:
import io.circe.generic.extras.{Configuration, ConfiguredJsonCodec} case class Foo(firstName: String) { def this() = this("") } // 把注解移到伴生对象上 @ConfiguredJsonCodec object Foo { implicit val snakeConfiguration: Configuration = Configuration.default.withSnakeCaseMemberNames }
这个方式同样能让Circe正确生成所需的编解码器,避免编译错误。
内容的提问来源于stack exchange,提问作者Сергей Залесский
相关产品推荐
相关产品推荐

