官方描述:
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值成功變成了空字串
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/293638.html
標籤:其他
