Scala中使用json-smart處理json

​ 最近在用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,肯定有犯蠢的地方,請大家多多指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章