最近在用scala重寫一些數據處理的腳本,頭一次接觸scala,十分不順手,遇到了各種各樣的問題,萬幸網上有各類博客和教程。但是遇到json處理的時候,網上的教程比較亂。自己嘗試了各種搜尋了各類資料之後決定使用json-smart。
直接上代碼了。
1 添加依賴
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>2.3</version>
</dependency>
2 導入
import net.minidev.json.{JSONArray, JSONObject, JSONValue}
import scala.collection.mutable
import scala.collection.JavaConversions.mapAsScalaMap
import scala.collection.JavaConversions.mutableMapAsJavaMap
後邊三個包是json和map互相轉換時用到的。
3 JSONObject類
這個類是整個庫的核心了,很多操作都是以它爲基礎。
3.1 轉換爲JSONObject
String->JSONObject
val str = """{"name":"test","age":25,"email":{"gmail":"test@gmail.com","outlook":"test@outlook.com"},"skills":["a","b","c"]}"""
val jsonObjFromString = JSONValue.parse(str).asInstanceOf[JSONObject]
println(jsonObjFromString)
println(jsonObjFromString.getClass)
結果:
{"skills":["a","b","c"],"name":"test","age":25,"email":{"gmail":"[email protected]","outlook":"[email protected]"}}
class net.minidev.json.JSONObject
Map->JSONObject
val map = mutable.Map("a" -> 1,"b" -> 2)
val jsonObjFromMap = JSONValue.parse(JSONObject.toJSONString(map)).asInstanceOf[JSONObject]
println(jsonObjFromMap)
println(jsonObjFromMap.getClass)
結果:
{"a":1,"b":2}
class net.minidev.json.JSONObject
這個比較蛋疼,需要先把map轉換成String,然後再用JSONValue.parse轉換成JSONObject。不知道是不是我沒找到合適的方法,有知道的大佬請告知。
這裏需要注意的是,傳入的Map必須是mutable.Map,同時需要導入標題2中的兩個包,因爲JSONObject的toJSONString方法只接受java.util.Map,導入上述包之後,mutable.Map就可以當做java.util.Map來使用。
3.2 JSONObject的一些操作
//添加鍵值對
println(jsonObjFromString.appendField("appending","Success"))
//結果 {"skills":["a","b","c"],"name":"test","appending":"Success","age":25,"email":{"gmail":"[email protected]","outlook":"[email protected]"}}
//獲取元素
println(jsonObjFromString.get("name"))
//結果 test
//直接獲取成String
println(jsonObjFromString.getAsString("name"))
//結果 test
//合併json,merge的返回值是Unit,只能先merge再操作
jsonObjFromString.merge(jsonObjFromMap)
println(jsonObjFromString)
//結果 {"skills":["a","b","c"],"a":1,"b":2,"name":"test","age":25,"email":{"gmail":"[email protected]","outlook":"[email protected]"}}
//修改值
jsonObjFromString.update("email","modified")
println(jsonObjFromString)
//結果 {"skills":["a","b","c"],"name":"test","age":25,"email":"modified"}
3.3 JSONObject轉換爲Map/Array
//簡單json轉Map,這裏轉的是immutable.Map,如果需要對Map操作之後再轉成json,需要先轉爲mutable.Map
println(jsonObjFromMap.toMap[String,Any])
println(jsonObjFromMap.toMap[String,Any].getClass)
//結果 Map(a -> 1, b -> 2)
// class scala.collection.immutable.Map$Map2
//immutable.Map轉爲mutable.Map
val muMap = mutable.Map(jsonObjFromMap.toMap[String,Any].toSeq: _*)
println(muMap.getClass)
//結果 class scala.collection.mutable.HashMap
//帶有數組的json,處理時需要先把數組提取出來轉換,再放回Map
val array = jsonObjFromString.get("skills").asInstanceOf[JSONArray].toArray
jsonObjFromString.remove("skills")
jsonObjFromString.appendField("skills",array)
println(jsonObjFromString.toMap[String,Any])
//結果 Map(skills -> [Ljava.lang.Object;@4fb64261, name -> test, age -> 25, email -> {"gmail":"[email protected]","outlook":"[email protected]"})
4 總結
基本上就是這樣,剛剛接觸scala,肯定有犯蠢的地方,請大家多多指教。