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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:03