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
相关产品推荐
相关产品推荐

