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

