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

Scala使用scala.util.parsing.json从JSON字符串中获取指定键对应值

Scala 使用内置 scala.util.parsing.json 获取指定键值的方法

首先说明:scala.util.parsing.json 是Scala早期版本内置的JSON解析工具,从Scala 2.11开始已被标记为废弃,生产环境更推荐使用circe、Play-Json等类型安全的第三方JSON库。如果需要强制使用该库实现需求,可参考以下方案:

已知JSON结构(无需全局遍历)

如果你明确知道brand的层级路径,不需要遍历整个JSON结构,直接按层级取值即可,代码如下:

import scala.util.parsing.json._

// 用Scala三引号字符串避免转义引号
val jsonString: String = """
    {
      "toys": {
        "orange toys": {
           "brand":"Toys-R-Us",
           "price":"123.45"
         } 
      },
      "date":"05-27-1996" 
    }
"""

// 解析JSON,返回Option[Any]类型,None代表解析失败
val parsedResult: Option[Any] = JSON.parseFull(jsonString)

// 按层级路径取值
val brandOpt: Option[String] = parsedResult match {
  // 根节点是Map结构
  case Some(root: Map[String, Any] @unchecked) =>
    root.get("toys") match {
      case Some(toys: Map[String, Any] @unchecked) =>
        toys.get("orange toys") match {
          case Some(orangeToys: Map[String, Any] @unchecked) =>
            orangeToys.get("brand").asInstanceOf[Option[String]]
          case _ => None
        }
      case _ => None
    }
  // 解析失败/结构不匹配返回None
  case _ => None
}

// 取值,可通过getOrElse设置默认值兜底
val brand = brandOpt.getOrElse("未知品牌")
println(brand) // 输出 Toys-R-Us

未知JSON结构(需要全局遍历)

如果你不知道brand所在的层级,可以写递归函数全局遍历查找该键,代码如下:

// 递归遍历所有层级查找目标键
def findTargetKey(json: Any, targetKey: String): Option[Any] = json match {
  case map: Map[String, Any] @unchecked =>
    // 先查当前层,不存在就递归查子节点
    map.get(targetKey).orElse(
      map.values.flatMap(findTargetKey(_, targetKey)).headOption
    )
  // 非Map结构直接返回None
  case _ => None
}

// 调用方法
val findResult = parsedResult.flatMap(findTargetKey(_, "brand")).asInstanceOf[Option[String]]
println(findResult.getOrElse("未找到")) // 输出 Toys-R-Us

注意事项

  • 该库没有类型安全保障,所有类型转换都是运行时校验,容易抛出类转换异常,非兼容旧代码场景不建议使用
  • 已知结构的情况下按层级取值的性能远高于全局遍历,优先使用该方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:39:04