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

Play框架中如何更新嵌套JsObject内部对象的指定键值

问题原因

你原代码中的错误是 JsObject 的 + 运算符仅支持添加单个 (String, JsValue) 类型的键值对,无法直接传入整个Map完成批量合并,合并多组键值对需要使用 ++ 运算符。

正确实现步骤

1. 转换数据库读取的配置格式

你从数据库拿到的是 Map[String, String] 结构,需要先将值包装为 JsString 才能和原有的 sparkConf JsObject合并:

// 示例:从数据库读取的额外sparkConf配置
val extraSparkConfFromDB: Map[String, String] = Map(
  "spark.executor.instances" -> "3",
  "spark.executor.cores" -> "2",
  "spark.executor.memory" -> "4g"
)

// 方式一:直接转成键值对序列,值包装为JsString
val extraConfKV = extraSparkConfFromDB.map { case (k, v) => k -> JsString(v) }

// 方式二:直接转为JsObject,后续直接合并
val extraConfJsObj = Json.toJson(extraSparkConfFromDB).as[JsObject]

2. 编写正确的JSON转换逻辑

import play.api.libs.json._

val transformer = (__ \ "spec" \ "sparkConf").json.update(
  __.read[JsObject].map(existingSparkConf =>
    // 合并现有配置和新增配置,重复Key会用新配置覆盖旧配置
    existingSparkConf ++ extraConfKV
    // 如果你用的是方式二转的JsObject,也可以写:existingSparkConf ++ extraConfJsObj
    // 如果要保留原有配置不被覆盖,调换顺序即可:extraConfJsObj ++ existingSparkConf
  )
)

3. 应用转换得到最终JSON

val updatedJson = json.transform(transformer) match {
  case JsSuccess(result, _) => result
  case JsError(err) => throw new RuntimeException(s"sparkConf合并失败:$err")
}

补充说明

如果你需要深度合并嵌套的JSON结构,也可以使用 existingSparkConf.deepMerge(extraConfJsObj) 方法,当前场景下sparkConf都是单层键值对,直接用++就可以满足需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:54:02