scala json相关操作

一、前言

  目前准备编写一个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是使用方法吧

 

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。