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

Scala 3 + http4s项目Circe JSON编解码deriveDecoder编译报错求助

问题原因

确实是Scala 3的特性变更导致的问题:
Scala 3放弃了Scala 2时代的Shapeless泛型推导机制,改用原生的deriving.Mirror机制实现编译期泛型派生。你当前使用的circe-generic依赖是针对Scala 2设计的,内部依赖Shapeless实现deriveDecoder,无法适配Scala 3的Mirror派生规则,因此编译时无法找到对应类型的Mirror实例。

解决方案

二选一即可:

方案1:使用Scala 3原生deriving语法(推荐)

无需额外修改依赖,直接在你的Joke类型定义上添加deriving声明即可自动生成编解码器,不需要手动编写implicit val推导代码:

import io.circe.{Decoder, Encoder}

// 此处Joke必须是case class/sealed trait才能自动派生
case class Joke(content: String, source: String) derives Decoder, Encoder

方案2:替换为Scala 3适配的circe泛型依赖

如果你仍需要使用半自动推导的写法,可以修改依赖配置:

  1. 移除原有circe-generic依赖,替换为Scala 3版本的泛型推导依赖:
// 原有circe-core保留,替换circe-generic为circe-generic-scala3
"io.circe" %% "circe-generic-scala3" % CirceVersion
  1. 保持原有推导代码不变,确认导入的是正确的semiauto包即可:
import io.circe.generic.semiauto._

implicit val jokeDecoder: Decoder[Joke] = deriveDecoder[Joke]
implicit val jokeEncoder: Encoder[Joke] = deriveEncoder[Joke]
额外优化建议
  • 你的Scala 3.0.0和Circe 0.14.1版本都比较老,存在较多Scala 3适配bug,建议升级到Scala 3.2+ + Circe 0.14.10+的组合,兼容性更好
  • 确认Joke是case class或者sealed trait,只有这两类类型才能被Scala 3自动生成Mirror实例,普通class会触发同样的编译错误

内容的提问来源于stack exchange,提问作者martyn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:54:03