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

如何实现Scala枚举的Circe大小写不敏感解码器?

解决Circe枚举大小写不敏感解析问题

你遇到的问题是Circe默认的枚举解码器只严格匹配枚举值的name属性(也就是定义时的首字母大写形式),而JSON里的gender是小写的"male",导致解析失败。要实现大小写不敏感解析,只需要自定义一个解码器替换默认的genderDecoder即可。

修改后的Gender枚举对象代码如下:

object Gender extends Enumeration {
  type Gender = Value
  val Male, Female, Unknown = Value

  // 自定义大小写不敏感的解码器
  implicit val genderDecoder: Decoder[Gender.Value] = Decoder.decodeString.emap { inputStr =>
    // 遍历枚举值,忽略大小写匹配名称
    values.find(_.name.equalsIgnoreCase(inputStr))
      .toRight(s"无效的性别值: $inputStr,允许的值为: ${values.map(_.name).mkString(", ")}")
  }

  implicit val genderEncoder: Encoder[Gender.Value] = Encoder.encodeEnumeration(Gender)
}

代码说明:

  • 用Decoder.decodeString先把JSON字段值解析成字符串
  • 通过emap方法把字符串转换为枚举值:遍历所有枚举值,用equalsIgnoreCase忽略大小写匹配名称
  • 如果匹配到对应枚举值就返回Right(Value),匹配失败则返回包含错误信息的Left

修改后再执行你的解析代码:

println(decode[Person]("""{"name": "John", "gender": "male"}""").right.get)

就能成功解析小写的"male",同时也兼容大写"Male"、混合大小写"mAle"等各种格式的输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 12:12:18