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
相关产品推荐
相关产品推荐

