如何实现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
相关产品推荐
相关产品推荐

