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

如何使用Scala的json4s向嵌套数组中添加元素

使用json4s为JSON中的entityVersion数组添加name字段

首先确保你的项目引入了json4s依赖,比如在sbt中添加:

libraryDependencies += "org.json4s" %% "json4s-native" % "4.0.6" // 版本可根据实际情况调整

下面是具体实现代码,核心是利用json4s的transform方法递归遍历JSON结构,定位到entityVersion数组内的对象并添加新字段:

import org.json4s._
import org.json4s.native.JsonMethods._

object JsonModifyDemo extends App {
  val jsonMessage: String =
    """{
      | "code": "OK",
      | "idEvent": "123",
      | "contract": {
      |     "idApplication": "001"
      | },
      | "version": {
      |     "idVersion": "1",
      |     "entity": [{
      |       "idEntity": "5",
      |       "entityType": [{
      |         "entityNumber": "147",
      |           "entityVersion": [{
      |             "entityCode": "A",
      |             "idCode": "753"
      |           }]
      |       }]
      |     }]
      | }
    }""".stripMargin

  // 声明隐式JSON格式
  implicit val formats: DefaultFormats.type = DefaultFormats

  // 解析原始JSON字符串为JValue结构
  val originalJson: JValue = parse(jsonMessage)

  // 定义转换逻辑:给entityVersion数组内的每个对象添加name字段
  val modifiedJson: JValue = originalJson.transformField {
    case ("entityVersion", JArray(items)) =>
      // 遍历数组中的每个对象,添加name字段(示例值设为"new_entity_name")
      val updatedItems = items.map {
        case obj: JObject => obj ~ ("name" -> JString("new_entity_name"))
        case other => other // 非对象类型保持原样
      }
      ("entityVersion", JArray(updatedItems))
    // 其他字段不做修改,直接返回
    case other => other
  }

  // 将修改后的JSON转为格式化字符串输出
  val resultJson: String = pretty(modifiedJson)
  println(resultJson)
}

代码说明:

  • parse(jsonMessage):把原始JSON字符串解析成json4s的JValue结构,方便后续操作。
  • transformField:json4s提供的字段转换方法,会递归遍历整个JSON结构,匹配到指定字段时执行修改逻辑。
  • 匹配到entityVersion对应的数组后,用map遍历数组内的每个对象,通过~操作符给JObject添加新的键值对。
  • pretty(modifiedJson):将修改后的JValue格式化为易读的JSON字符串,若需要紧凑格式可改用compact。

如果需要根据对象现有字段动态设置name值,比如根据entityCode生成,可修改遍历逻辑:

val updatedItems = items.map {
  case obj: JObject =>
    val code = (obj \ "entityCode").extractOpt[String].getOrElse("default")
    obj ~ ("name" -> JString(s"entity_$code"))
  case other => other
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:32:43