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

使用Circe从JSON数组中删除指定key的正确代码实现

解决Circe删除JSON数组中每个对象指定字段的问题

你的问题出在代码只处理了数组的第一个元素——downArray只是将光标定位到数组的第一个元素上,并没有遍历整个数组的所有对象,所以只有第一个对象的"c"字段被删除了,其他元素完全没被修改。

这里提供两种简洁的解决方案,都能实现遍历数组所有元素并删除每个对象的"c"键:

方法一:使用Cursor的mapArray遍历处理

这种方式基于Cursor API,适合需要更精细控制JSON操作的场景:

import io.circe._
import io.circe.parser._

parse(entityAs[String]) match {
  case Right(json) =>
    // 遍历数组的每个元素Cursor,删除每个对象的"c"字段
    val processedCursor = json.hcursor.mapArray { elementCursors =>
      elementCursors.map(_.downField("c").delete)
    }
    
    processedCursor.right.as[List[Json]] match {
      case Right(result) =>
        println(">>>>>>>>>>>>>>>>>>")
        println(result)
        // 如果需要格式化输出JSON字符串,可使用Circe的Printer
        println(Printer.spaces2.print(Json.fromValues(result)))
      case Left(error) => println(s"处理结果时出错: $error")
    }
  case Left(error) => println(s"解析输入JSON时出错: $error")
}

方法二:直接使用Json的转换方法(更简洁)

如果不需要复杂的光标操作,直接用Json的高阶方法可以一行完成转换:

import io.circe._
import io.circe.parser._

parse(entityAs[String]) match {
  case Right(json) =>
    // 遍历数组每个元素,移除每个对象的"c"字段
    val resultJson = json.mapArray(_.map(_.mapObject(_.remove("c"))))
    
    resultJson.as[List[Json]] match {
      case Right(result) =>
        println(">>>>>>>>>>>>>>>>>>")
        println(result)
      case Left(error) => println(s"处理结果时出错: $error")
    }
  case Left(error) => println(s"解析输入JSON时出错: $error")
}

关键逻辑说明

  • mapArray:用于遍历JSON数组的所有元素,对每个元素应用转换逻辑
  • mapObject:针对JSON对象类型,移除指定字段(这里是"c")
  • 两种方法最终都会返回处理后的完整JSON数组,之后可以轻松转换为List[Json]类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:12:29