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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:03:22