官方描述:
Gson是一个Java库,可用于将Java对象转换为其JSON表示。它还可以用于将JSON字符串转换为等效的Java对象。
Gson 是用于将 Java 对象与 JSON格式字符串数据相互转换的 Java 库。它起初在Google 内部广泛使用在 Android 平台 和 Java 服务端上。2008 年开源之后,成为了谷歌又一个被广泛使用的开源框架,相同作用的类库还有 Spring Framework 中集成的 Jackson,以及阿里开源的 FastJson等。
Gson是解析json速度最快的工具
主要用于处理JSON数据,可实现序列化和反序列化
Gson对象的创建有两种方式:
-
val gson:Gson=new Gson()
-
val gson=new GsonBulider().creat()
第二种方式可以制定额外的行为,如格式化,是否序列化null值
-
序列化scala对象
class Person(val name: String, val age: Int,val hobby:AnyRef) {
println("调用Person")
}
object gsonTest {
def main(args: Array[String]): Unit = {
//构建类对象
val p1 = new Person("www", 11,null)
//创建gson
val gson: Gson = new Gson
//序列化p1
println(gson.toJson(p1))
//使用方式二修改格式
val gson1: Gson = new GsonBuilder().setPrettyPrinting.create()
println(gson1.toJson(p1))
}
}
输出:
正常序列化后的 JSON 字符串是紧凑格式,节省字符串内存,使用GsonBuilderset().setPrettyPrinting
方法之后最终输出的 JSON 字符串是更易读的格式。
发现默认的Gson对象null字段会被忽略,可使用serializeNulls
来序列化null字段
val builderGson: Gson = new GsonBuilder().setPrettyPrinting.serializeNulls.create
println(builderGson.toJson(p1))
-
反序列化
val jsonStr: String = "{\"name\":\"jack\",\"age\":18,\"hobby\":null}"
//通过json字符串构建scala对象
val p2: Person = gson.fromJson(jsonStr,classOf[Person])
println(s"name:${p2.name},age:${p2.age}")
输出
-
其他功能
可使用JsonObject生成对象,再使用toJson生成JSON字符串
可将JSON字符串化为Map集合
可将JSON数据与Array,List互相转换
自定义序列化
自定义序列化:
可以实现对某些字段进行特殊处理,比如隐藏某些字段的序列化,对字段的数据格式化处理等
也可以针对某种类型进行处理
把所有String字段变为数字11
/对象
class MyObject(val hobby: String,val name:String,val age:Int){
}
//继承JsonSerializer 接口
class nullTypeSerializer extends JsonSerializer[String]{
//自定义serialize方法
override def serialize(src: String, typeOfSrc: Type, context: JsonSerializationContext) =
new JsonPrimitive(11)
}
object gsonTest {
def main(args: Array[String]): Unit = {
val myObject=new MyObject("test","jack",18)
//原序列化
val gson:Gson=new Gson()
println("原格式为:"+gson.toJson(myObject))
//自定义序列化
val gson1: Gson = new GsonBuilder().serializeNulls().registerTypeAdapter(classOf[String], new nullTypeSerializer()).create()
val jsonStr=gson1.toJson(myObject)
println("自定义序列化的结果为:"+jsonStr)
}
}
结果:
所有String字段成功变为11,其他类型字段为发生改变
尝试对所有Null字段进行处理
null字段未发生改变
查看adapter源码
value等于null的时候,直接输出了null
可以通过注册自定义adapter来修改
//对象
class MyObject(val hobby: String, val name: String, val age: Int) {
}
//继承JsonSerializer 接口
class nullTypeSerializer extends JsonSerializer[Null] {
//自定义serialize方法
override def serialize(src: Null, typeOfSrc: Type, context: JsonSerializationContext) =
new JsonPrimitive(11)
}
object gsonTest {
val str: TypeAdapter[String] = new TypeAdapter[String] {
override def read(in: stream.JsonReader): String = {
if (in.peek() == JsonToken.NULL) {
in.nextNull()
""
} else {
in.nextString()
}
}
override def write(out: stream.JsonWriter, value: String): Unit = {
if (value == null) {
out.value("")
} else {
out.value(value)
}
}
}
def main(args: Array[String]): Unit = {
val myObject = new MyObject(null, "jack", 18)
//原序列化
val gson: Gson = new Gson()
println("原格式为:" + gson.toJson(myObject))
//使用自定义适配器
val gson1 = new GsonBuilder()
gson1.serializeNulls().registerTypeAdapter(classOf[String], str)
val gson2 = gson1.create()
val jsonStr = gson2.toJson(myObject)
println("自定义序列化的结果为:" + jsonStr)
}
}
输出:
null值成功变成了空字符串