如何使用Circe解码含JSON对象的数组并提取目标字段无需额外封装类
当前解码器不生效的核心原因是:JSON中data字段为数组类型,现有代码直接对数组对象取内部字段,类型不匹配导致解析失败。
你可以根据自己的业务场景选择以下两种无需额外定义封装类的实现方案:
方案1:直接解析为单个CryptoData(适配data数组仅1个元素的场景)
用Circe自带的downArray方法定位到数组的第一个元素,再提取对应字段即可:
implicit val decoder: Decoder[CryptoData] = Decoder.instance { json => val dataFirstItem = json.downField("data").downArray for { value <- dataFirstItem.get[String]("value") valueClassification <- dataFirstItem.get[Sentiment]("value_classification") } yield CryptoData(value, valueClassification) }
如果遇到data数组为空的情况,该解码器会自动返回解码失败的错误,完全适配你给出的JSON结构特性。
方案2:解析为List[CryptoData](适配data数组多元素的场景)
如果需要兼容data数组存在多个元素的情况,可以拆分解码器逻辑,不需要定义任何外层封装类:
// 定义单个data条目的解码器 implicit val singleCryptoDecoder: Decoder[CryptoData] = Decoder.instance { json => for { value <- json.get[String]("value") valueClassification <- json.get[Sentiment]("value_classification") } yield CryptoData(value, valueClassification) } // 定义根JSON的解码器,直接提取data数组解析为列表 implicit val cryptoListDecoder: Decoder[List[CryptoData]] = _.downField("data").as[List[CryptoData]]
使用时直接对整个JSON调用as[List[CryptoData]]就能拿到所有条目解析结果。
内容的提问来源于stack exchange,提问作者Ry2254
相关产品推荐
相关产品推荐

