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

如何在Scala中向二级嵌套JSON对象插入testId字段?

使用json4s Jackson动态为JSON嵌套对象添加字段

依赖配置(SBT)

首先在项目中添加json4s相关依赖:

libraryDependencies ++= Seq(
  "org.json4s" %% "json4s-jackson" % "4.0.6",
  "org.json4s" %% "json4s-core" % "4.0.6"
)

实现代码

以下代码无需硬编码case class,可动态处理任意数量的testTags子对象:

import org.json4s._
import org.json4s.jackson.JsonMethods._

object JsonTransformer {
  def main(args: Array[String]): Unit = {
    val beforeJson = """{"testId": 123,"testTags": {"ALTIMETER": {"result": [{"ts": "2023-04-17T12:11:18Z","Actual": "5"},{"ts": "2023-04-18T12:11:18Z","Actual": "4"}]},"WEIGHT": {"result": [{"ts": "2023-04-17T12:11:18Z","Actual": 0.846},{"ts": "2023-04-17T15:15:13Z","Actual": 0.845}]}}}"""

    // 解析原始JSON
    val parsedJson = parse(beforeJson)

    // 提取根节点的testId值
    val testId = (parsedJson \ "testId").extract[Int]

    // 更新testTags下的所有子对象,添加testId字段
    val updatedTestTags = (parsedJson \ "testTags") match {
      case JObject(tagEntries) =>
        JObject(tagEntries.map { case (tagName, tagObj) =>
          // 将testId合并到每个子对象中
          tagName -> (tagObj merge JObject("testId" -> JInt(testId)))
        })
      case other => other // 若testTags不是对象类型,保持原样
    }

    // 生成最终的JSON对象
    val afterJson = parsedJson.replaceField("testTags", updatedTestTags)

    // 输出格式化后的结果
    println(pretty(afterJson))
  }
}

关键逻辑说明

  • 动态解析:用parse方法将JSON字符串转为JValue,无需预定义case class,适配任意结构的testTags。
  • 字段提取:通过\操作符定位根节点的testId,用extract获取其值。
  • 批量更新:遍历testTags的所有键值对,用merge方法将testId字段合并到每个子对象中,自动处理所有子对象,不管数量多少。
  • 重组JSON:用replaceField替换原testTags字段,保留其他原有字段不变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:33:26