You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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,提问作者Сергей Залесский

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:30:05