最近在用scala重写一些数据处理的脚本,头一次接触scala,十分不顺手,遇到了各种各样的问题,万幸网上有各类博客和教程。但是遇到json处理的时候,网上的教程比较乱。自己尝试了各种搜寻了各类资料之后决定使用json-smart。
直接上代码了。
<dependency>
<groupId>net.minidev</groupId>
<artifactId>json-smart</artifactId>
<version>2.3</version>
</dependency>
import net.minidev.json.{JSONArray, JSONObject, JSONValue}
import scala.collection.mutable
import scala.collection.JavaConversions.mapAsScalaMap
import scala.collection.JavaConversions.mutableMapAsJavaMap
后边三个包是json和map互相转换时用到的。
这个类是整个库的核心了,很多操作都是以它为基础。
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":"test@gmail.com","outlook":"test@outlook.com"}}
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来使用。
//添加键值对
println(jsonObjFromString.appendField("appending","Success"))
//结果 {"skills":["a","b","c"],"name":"test","appending":"Success","age":25,"email":{"gmail":"test@gmail.com","outlook":"test@outlook.com"}}
//获取元素
println(jsonObjFromString.get("name"))
//结果 test
//直接获取成String
println(jsonObjFromString.getAsString("name"))
//结果 test
//合并json,merge的返回值是Unit,只能先merge再操作。
//注意,两个json具有相同key值的时候,merge会报错,需要putAll方法
jsonObjFromString.merge(jsonObjFromMap)
println(jsonObjFromString)
//结果 {"skills":["a","b","c"],"a":1,"b":2,"name":"test","age":25,"email":{"gmail":"test@gmail.com","outlook":"test@outlook.com"}}
//putAll方法
json1.put("a",Integer.valueOf(1))
json1.put("b",Integer.valueOf(2))
json2.put("c",Integer.valueOf(3))
json2.put("b",Integer.valueOf(4))
json1.putAll(json2)
print(json1)
//结果 {"a":1,"b":4,"c":3}
//修改值
jsonObjFromString.update("email","modified")
println(jsonObjFromString)
//结果 {"skills":["a","b","c"],"name":"test","age":25,"email":"modified"}
//简单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":"test@gmail.com","outlook":"test@outlook.com"})
基本上就是这样,刚刚接触scala,肯定有犯蠢的地方,请大家多多指教。