一、前言
目前准备编写一个scala项目基础类库,有这样一个需求,将String类型的Json转为Map或其他扩展对象。
二、几种方法探讨
1)scala自带的Json解析
scala 2.10(以上,其他版本不清楚)自带Json解析,scala.util.parsing.json.JSON
使用方法如下:
val json = JSON.parseFull(string)
作为一个python,php转过来的同学,期待这句话的执行结果是一个Map(json),Map里面按照实际的字符串解析成一个复杂的List,Map嵌套结构,但是这句话返回的是一个Option,没有明确的类型,如果要获取其中的结构,你得这样写代码(代码来源:stackoverflow)
val json:Option[Any] = JSON.parseFull(jsonString) val map:Map[String,Any] = json.get.asInstanceOf[Map[String, Any]] val languages:List[Any] = map.get("languages").get.asInstanceOf[List[Any]] languages.foreach( langMap => { val language:Map[String,Any] = langMap.asInstanceOf[Map[String,Any]] val name:String = language.get("name").get.asInstanceOf[String] val isActive:Boolean = language.get("is_active").get.asInstanceOf[Boolean] val completeness:Double = language.get("completeness").get.asInstanceOf[Double]
相当反人类,解析过程和json字符串是一个紧耦合,换个字符串又要重新写一套代码。该stackoverflow帖子给出的答案,也没做到解耦。
使用模式匹配如:case Some(map: Map[String, Any]) => println(map),编译过程会有warning,据分析jvm在执行的时候会擦除类型(作为一个新手不太懂,请指教),这个过程也很繁琐。
2)scala 第三方类库
使用第三方类库的麻烦在于,项目的实际执行环境可能没有所需的库,需要加path或者将该类库打包到该项目中。对于一个编写项目基础库的强迫症患者来讲,为了一个功能增加一个大而全的第三方库是相当难以接受的,无奈自己的scala水平相当初级,没有能力自己实现。我在网上找到一个比较轻量级的Json第三方类库,spray-json,jar包解开,大概有14个scala源文件,github项目地址:链接,maven引用方法如下:
<dependency> <groupId>io.spray</groupId> <artifactId>spray-json_2.10</artifactId> <version>1.3.2</version> </dependency>
sbt引用方法如下:
libraryDependencies += "io.spray" %% "spray-json" % "1.3.2"
下面主要介绍一下spray-json是使用方法吧
时间: 2024-10-05 05:01:59