Scala中如何利用映射替换字符串内session中name字段的对应值
解决方案:仅替换Session内Name字段的值
针对你的需求,这里提供两种可行方案,优先推荐第二种(JSON解析方式),避免正则的局限性。
方法一:正则匹配替换(适用于固定格式场景)
利用正则精准定位session字段内的name值,再通过映射替换:
import scala.util.matching.Regex val replacements = Map("123" -> "d", "234" -> "x", "345" -> "mx") val str = "{\"section\":[{\"data\":\"xyz\",\"session\":\"{\\\"name\\\":234}\",\"data2\":\"234\"}]}" // 匹配session字段中"name":后的数值部分 val nameInSessionRegex: Regex = """("session":"\{\\\\"name\\\\":)(\d+)("})""".r // 执行替换:捕获到的数值用映射匹配,无匹配则保留原值 val result = nameInSessionRegex.replaceAllIn(str, m => { val targetVal = m.group(2) s"${m.group(1)}${replacements.getOrElse(targetVal, targetVal)}${m.group(3)}" }) println(result) // 输出:{"section":[{"data":"xyz","session":"{\"name\":x}","data2":"234"}]}
注意:正则依赖固定的字符串格式,若
session内的JSON结构出现变化(如值带引号、空格),正则会失效。
方法二:JSON解析修改(推荐,兼容性更强)
使用专业JSON库解析外层JSON,再处理session内的嵌套JSON字符串,修改后重新序列化:
以Play JSON为例,先添加SBT依赖:
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"
实现代码:
import play.api.libs.json._ val replacements = Map("123" -> "d", "234" -> "x", "345" -> "mx") val str = "{\"section\":[{\"data\":\"xyz\",\"session\":\"{\\\"name\\\":234}\",\"data2\":\"234\"}]}" // 解析外层JSON val outerJson = Json.parse(str) // 遍历section数组,更新每个元素的session字段 val updatedOuter = outerJson.transform( (__ \ "section").json.update( Reads.seq( (__ \ "session").json.update( Reads.of[String].map { sessionStr => // 解析session内的JSON字符串 val sessionJson = Json.parse(sessionStr) // 更新name字段值 val updatedSession = sessionJson.transform( (__ \ "name").json.update( Reads.of[JsValue].map { case JsString(v) => JsString(replacements.getOrElse(v, v)) case JsNumber(n) => JsString(replacements.getOrElse(n.toString, n.toString)) case other => other } ) ).getOrElse(sessionJson) // 转回字符串 Json.stringify(updatedSession) } ) ).map(JsArray(_)) ) ).getOrElse(outerJson) val result = Json.stringify(updatedOuter) println(result) // 输出:{"section":[{"data":"xyz","session":"{\"name\":\"x\"}","data2":"234"}]}
该方法能兼容name值为字符串或数字的情况,且不受JSON格式微调影响,稳定性更高。
内容的提问来源于stack exchange,提问作者Naomi
相关产品推荐
相关产品推荐

