Scala中如何读取JSON指定Key的值并拼接成目标字符串?
Scala动态解析过滤配置JSON并拼接属性字符串方案
实现思路
核心是借助Scala常用JSON库动态解析配置文件,定位到指定对象节点后提取所有值并拼接,全程不硬编码任何Key。下面以Play JSON和Circe两个主流库为例给出具体实现。
方案1:使用Play JSON库
1. 引入依赖(SBT)
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"
2. 完整实现代码
import play.api.libs.json._ import scala.io.Source object JsonFilterParser { def main(args: Array[String]): Unit = { // 从文件加载配置JSON(也可直接传入JSON字符串解析) val configJson = Json.parse(Source.fromFile("filter-config.json").mkString) // 指定要提取的目标对象名称,比如"Orders" val targetObj = "Orders" // 动态提取并拼接属性字符串 val result = (configJson \ targetObj).validate[JsObject] match { case JsSuccess(obj, _) => obj.values.map(_.as[String]).mkString(",") case JsError(errors) => s"解析$targetObj失败:${errors.mkString(",")}" } println(result) // 输出:order_id,customers.customerId } }
代码说明
Json.parse负责将JSON文件内容/字符串解析为JsValue节点(configJson \ targetObj)通过动态传入的对象名定位到目标节点validate[JsObject]验证目标节点是否为合法JSON对象,避免格式错误obj.values获取对象下所有值,转换为字符串后用mkString(",")拼接成要求的格式
方案2:使用Circe库
1. 引入依赖(SBT)
libraryDependencies += "io.circe" %% "circe-core" % "0.14.6" libraryDependencies += "io.circe" %% "circe-parser" % "0.14.6"
2. 完整实现代码
import io.circe._ import io.circe.parser._ import scala.io.Source object CirceJsonParser { def main(args: Array[String]): Unit = { val configJsonStr = Source.fromFile("filter-config.json").mkString val targetObj = "Orders" parse(configJsonStr) match { case Right(json) => json.hcursor.downField(targetObj).as[JsonObject] match { case Right(obj) => obj.values .map(_.asString.getOrElse("")) // 处理非字符串值的默认情况 .mkString(",") case Left(err) => s"解析$targetObj失败:$err" } case Left(err) => s"解析配置JSON失败:$err" } } }
注意事项
- 如果配置JSON中存在非字符串类型的值,需根据业务场景调整转换逻辑,比如添加默认值或抛出异常
- 可将核心逻辑封装为工具函数复用,例如Play JSON版本:
def getFilterAttrs(config: JsValue, target: String): Either[String, String] = { (config \ target).validate[JsObject].map(_.values.map(_.as[String]).mkString(",")) .left.map(errs => s"解析失败:${errs.mkString(",")}") }
内容的提问来源于stack exchange,提问作者Shankar Panda
相关产品推荐
相关产品推荐

