使用Scala基础包自带JSON工具如何提取JSON目标数组用于并行查询
基于Scala标准库解析JSON获取查询数组的实现方案
报错根因
scala.util.parsing.json.JSON.parseFull返回值是Any类型,Scala编译器不知道这个Any到底是字符串、数字还是集合类型,自然无法直接调用toArray这类集合方法,必须顺着JSON的实际结构逐层完成类型收敛后才能操作集合- 原有代码中
getOrElse(0)存在逻辑隐患:如果JSON解析失败会返回整型0,后续做类型转换时会触发无明确提示的类转换异常 - 使用
scala.util.parsing.json解析时的默认映射规则:JSON对象映射为Map[String, Any],JSON数组映射为List[Any],JSON字符串映射为String类型
无第三方依赖的实现代码
所有逻辑完全基于Scala和JDK内置能力实现,适配严格的依赖管控规则:
import scala.util.parsing.json.JSON import scala.io.Source val input_file = "[path]/FeatureMapping.json" // 读取文件内容,显式关闭文件流避免资源泄漏 val fileSource = Source.fromFile(input_file) val jsonContent = fileSource.mkString fileSource.close() // 通过模式匹配逐层校验结构合法性,避免硬转崩溃 JSON.parseFull(jsonContent) match { // 匹配根结构为Map(对应最外层的JSON对象) case Some(rootMap: Map[_, _]) => // 取出TestModel对应的配置值 rootMap.get("TestModel") match { // 匹配值为List结构(对应JSON数组) case Some(queryList: List[_]) => // 将列表元素逐个转为String类型,转换为Array类型 val queryArray = queryList.map(_.asInstanceOf[String]).toArray // 若需并行执行,直接对数组调用.par获得并行集合即可,示例: queryArray.par.foreach(cql => { // 在此处写入你执行CQL查询的业务逻辑 println(s"并行执行CQL:$cql") }) case None => throw new IllegalArgumentException("JSON中缺失TestModel配置项") case invalidValue => throw new IllegalArgumentException(s"TestModel对应值不是数组结构,实际类型为${invalidValue.getClass}") } case None => throw new IllegalArgumentException("JSON格式不合法,解析失败") case invalidRoot => throw new IllegalArgumentException(s"JSON根结构不是对象类型,实际内容为$invalidRoot") }
实现说明
- 最终得到的
queryArray类型为Array[String],完全满足并行执行查询语句的POC需求 - 所有类型转换前置了结构合法性校验,出现结构不匹配时会抛出明确的错误信息,不会触发无提示的类转换异常
- 整个流程未引入任何外部第三方依赖,完全适配企业级依赖引入规则
内容的提问来源于stack exchange,提问作者troyblerg
相关产品推荐
相关产品推荐

