Scala如何用Circe解码对象列表:GreedIndex解码器异常排查
故障原因
- 路径解析错误(核心问题):
CryptoData解码器的定位逻辑完全错误。外层GreedIndex解码器已经通过json.get[List[CryptoData]]("data")获取到了根节点下的data数组,Circe会自动遍历数组,将每个数组元素作为入参传给CryptoData的解码器。你在CryptoData解码器中额外执行json.downField("data").downArray,相当于在单条CryptoData的JSON对象里再次查找名为data的字段、再定位到数组第一个元素,自然找不到value/value_classification等字段,直接解析失败。 - 字段映射注意项:你
CryptoData类第一个参数名为greedValue,解析时取的是JSON的value字段,手动赋值逻辑没问题,如果你后续不需要用自动推导解码器就不需要调整,要改的话保持字段名和JSON key一致也可以。 - 潜在隐式依赖缺失:如果你没有自定义
Sentiment类型的隐式Decoder,字符串转枚举/自定义类型的步骤也会抛出解析错误,需要提前实现对应类型的解码器。
修复方案
直接修改CryptoData的解码器实现,删掉多余的路径定位逻辑即可:
object CryptoData { // 若Sentiment是自定义枚举/类型,需先实现对应解码器,示例如下: // implicit val sentimentDecoder: Decoder[Sentiment] = Decoder.decodeString.emap { str => // Sentiment.values.find(_.toString == str).toRight(s"无效的情绪类型: $str") // } implicit val cryptoDecoder: Decoder[CryptoData] = Decoder.instance { json => for { value <- json.get[String]("value") valueClassification <- json.get[Sentiment]("value_classification") timestamp <- json.get[String]("timestamp") } yield CryptoData(value, valueClassification, timestamp.toLong * 1000) } }
内容的提问来源于stack exchange,提问作者Ry2254
相关产品推荐
相关产品推荐

