当前位置: 首页 > 工具软件 > json-smart > 使用案例 >

Scala中使用json-smart处理json

司徒钱青
2023-12-01

​ 最近在用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":"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来使用。

3.2 JSONObject的一些操作
//添加键值对
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"}
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":"test@gmail.com","outlook":"test@outlook.com"})

4 总结

​ 基本上就是这样,刚刚接触scala,肯定有犯蠢的地方,请大家多多指教。

 类似资料: