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

Scala中JSON解码、修改与编码:如何更新JSON字段

解决Circe中JSON字段的添加/修改问题

你需要实现对JSON中的bulkApi字段进行「不存在则添加、存在则覆盖」的逻辑,以下是针对Circe库的有效解决方案:

问题分析

你之前尝试的deepMerge失效,大概率是两个原因:

  • 原JSON并非对象类型(比如是数组、字符串),导致合并逻辑不生效
  • 没有将bulkApi变量转换为Circe的Json类型,导致类型不匹配

解决方案

方案1:直接操作JSON对象(推荐)

通过asObject判断原JSON是否为对象,再直接添加/覆盖字段:

val updatedJson = value.asObject match {
  case Some(obj) => 
    // 添加或覆盖bulkApi字段,这里假设bulkApi是布尔值,根据实际类型调整转换方法
    obj.add("bulkApi", Json.fromBoolean(bulkApi)).asJson
  case None => 
    // 原JSON不是对象的情况,可根据需求返回原数据或生成新对象
    value
}

方案2:修正deepMerge用法

如果坚持使用deepMerge,需要确保操作的是JSON对象,并正确转换字段值:

val updatedJson = value.asObject match {
  case Some(obj) => 
    obj.deepMerge(Json.obj("bulkApi" -> Json.fromBoolean(bulkApi))).asJson
  case None => 
    // 原非对象时,直接生成包含目标字段的新对象
    Json.obj("bulkApi" -> Json.fromBoolean(bulkApi))
}

方案3:简洁链式写法(Circe 0.14+)

利用mapObject自动处理非对象场景,写法更简洁:

import io.circe.syntax._

val updatedJson = value.mapObject(_.add("bulkApi", bulkApi.asJson))

注意事项

  • 若bulkApi不是布尔值,替换对应的Json.fromXxx方法即可(比如Json.fromString、Json.fromInt)
  • 如果需要处理嵌套字段,可通过obj("parentField").asObject逐层操作后再合并回原对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:52:09