如何用Scala内置函数解析简单JSON并提取字段?
解析JSON到Scala变量的实用方案
嘿,我之前也试过用Scala内置工具处理JSON,确实踩过点小坑,给你整理两种可行的方法:一种是用Scala旧版本自带的解析器(纯内置),另一种是现在社区主流的类型安全方案(配置简单,比内置的好用太多)。
方案一:用Scala内置的scala.util.parsing.json.JSON(适合Scala 2.11及更早版本)
这个是Scala标准库曾经自带的JSON解析工具,不过在2.11之后就被标记为废弃了,但如果你用的是旧版本,还是能凑合用。
首先要注意,你的input_json得是合法的Scala字符串,我给你调整了写法:
import scala.util.parsing.json.JSON // 用三重引号包裹JSON,避免转义双引号 val input_json = """{"name" : "john", "id" : 101}""" // 解析JSON,返回的是Option[Any],所以用模式匹配处理 JSON.parseFull(input_json) match { case Some(jsonMap: Map[String, Any]) => // 手动转换类型(这也是内置工具的缺点,类型不安全) val v1 = jsonMap("name").asInstanceOf[String] val v2 = jsonMap("id").asInstanceOf[Int] println(s"解析结果:v1=$v1, v2=$v2") // 输出 解析结果:v1=john, v2=101 case None => println("JSON格式不对,解析失败啦") case other => println(s"奇怪,解析出了意料之外的结果:$other") }
注意:这个工具的类型转换是硬转的,如果JSON里的字段类型和你预期的不一样,会抛出ClassCastException,所以用的时候要小心。
方案二:用Play JSON(社区主流推荐,类型安全)
虽然这个不是纯内置的,但只需要加个依赖就能用,而且类型安全,错误处理也更清晰,比内置工具靠谱多了。
第一步,在你的build.sbt里添加依赖(版本号可以根据你的Scala版本调整):
libraryDependencies += "com.typesafe.play" %% "play-json" % "2.9.2"
然后写解析代码:
import play.api.libs.json._ // 先定义一个样例类,和JSON的结构对应起来 case class User(name: String, id: Int) // 让Play JSON自动推导这个样例类的JSON格式化器 implicit val userFormatter: OFormat[User] = Json.format[User] val input_json = """{"name" : "john", "id" : 101}""" // 解析JSON并验证类型 val parseResult = Json.parse(input_json).validate[User] parseResult match { case JsSuccess(user, _) => val v1 = user.name val v2 = user.id println(s"解析成功:v1=$v1, v2=$v2") case JsError(errors) => println(s"解析出错了:$errors") }
这个方案的好处是,要是JSON里的id不是数字,或者少了name字段,会直接返回清晰的错误信息,不会随便抛异常,代码也更易读。
小总结
如果必须用纯内置工具,只能选第一种,但要注意它的局限性;如果可以引入第三方库,强烈推荐第二种,写起来省心,维护起来也方便。
内容的提问来源于stack exchange,提问作者Vasudeva
相关产品推荐
相关产品推荐

