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

