-
Gson:
這是Gson的核心類蒜胖,它可以將對象轉(zhuǎn)換為JSON字符串督惰,或者將JSON字符串轉(zhuǎn)換為對象采呐。它使用反射機(jī)制來自動(dòng)匹配對象的字段和JSON的屬性蕉堰,不需要額外的配置或注解凌净。它適合處理簡單和穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),例如用戶信息屋讶、商品列表等冰寻。使用方法是創(chuàng)建一個(gè)Gson對象,然后調(diào)用其toJson()和fromJson()方法丑婿。
// 創(chuàng)建一個(gè)Gson對象
val gson = Gson()
// 創(chuàng)建一個(gè)表示用戶的類User
data class User(
val id: Int,
val name: String,
val email: String,
val phone: String
)
// 創(chuàng)建一個(gè)User對象
val user = User(1, "Alice", "alice@gmail.com", "1234567890")
// 使用Gson對象的toJson()方法將User對象轉(zhuǎn)換為JSON字符串
val json = gson.toJson(user) // {"id":1,"name":"Alice","email":"alice@gmail.com","phone":"1234567890"}
// 使用Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為User對象
val user2 = gson.fromJson(json, User::class.java) // User(id=1, name=Alice, email=alice@gmail.com, phone=1234567890)
-
GsonBuilder:
這是一個(gè)輔助類性雄,它可以讓您定制Gson的行為和特性,例如設(shè)置日期格式羹奉、排除策略秒旋、版本控制诀拭、自定義序列化和反序列化等细卧。它適合處理復(fù)雜和靈活的數(shù)據(jù)結(jié)構(gòu),例如泛型筒占、循環(huán)引用贪庙、動(dòng)態(tài)類型等。使用方法是創(chuàng)建一個(gè)GsonBuilder對象翰苫,然后調(diào)用其各種設(shè)置方法止邮,最后調(diào)用其create()方法來生成一個(gè)Gson對象这橙。
// 創(chuàng)建一個(gè)GsonBuilder對象
val gsonBuilder = GsonBuilder()
//省略配置代碼
// 使用GsonBuilder對象的create()方法來生成一個(gè)Gson對象
val gson2 = gsonBuilder.create()
-
JsonReader:
這是一個(gè)讀取JSON數(shù)據(jù)的類,它可以讓您以流式的方式讀取JSON數(shù)據(jù)导披,而不需要將整個(gè)JSON文檔加載到內(nèi)存中屈扎。它適合處理大型和未知的JSON數(shù)據(jù),例如網(wǎng)絡(luò)響應(yīng)撩匕、日志文件等鹰晨。使用方法是創(chuàng)建一個(gè)JsonReader對象,然后調(diào)用其各種讀取方法止毕,如beginObject()模蜡、endObject()、nextName()滓技、nextString()等哩牍。
// 創(chuàng)建一個(gè)JsonReader對象,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)
// 使用JsonReader對象的各種讀取方法令漂,以流式的方式讀取JSON數(shù)據(jù)膝昆,而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對
val name = jsonReader.nextName() // 讀取鍵名
when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
"id" -> {
val id = jsonReader.nextInt() // 讀取整數(shù)值
println("id: $id")
}
"name" -> {
val name = jsonReader.nextString() // 讀取字符串值
println("name: $name")
}
"email" -> {
val email = jsonReader.nextString() // 讀取字符串值
println("email: $email")
}
"phone" -> {
val phone = jsonReader.nextString() // 讀取字符串值
println("phone: $phone")
}
else -> {
jsonReader.skipValue() // 跳過其他值
}
}
}
jsonReader.endObject() // 結(jié)束讀取一個(gè)JSON對象
-
JsonWriter:
這是一個(gè)寫入JSON數(shù)據(jù)的類,它可以讓您以流式的方式寫入JSON數(shù)據(jù)叠必,而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對象荚孵。它適合處理大型和未知的JSON數(shù)據(jù),例如網(wǎng)絡(luò)請求纬朝、日志文件等收叶。使用方法是創(chuàng)建一個(gè)JsonWriter對象,然后調(diào)用其各種寫入方法共苛,如beginObject()判没、endObject()、name()隅茎、value()等澄峰。
// 創(chuàng)建一個(gè)JsonWriter對象,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中
// 使用JsonWriter對象的各種寫入方法辟犀,以流式的方式寫入JSON數(shù)據(jù)俏竞,而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對,鍵名為id堂竟,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對魂毁,鍵名為name串结,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對尺锚,鍵名為email,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對畏浆,鍵名為phone税稼,值為1234567890
jsonWriter.endObject() // 結(jié)束寫
-
JsonParser:
這是一個(gè)解析JSON數(shù)據(jù)的類烦秩,它可以讓您將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu)刁赦,每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對象,可以是JsonObject闻镶、JsonArray、JsonPrimitive或JsonNull丸升。它適合處理動(dòng)態(tài)和不規(guī)則的JSON數(shù)據(jù)铆农,例如用戶輸入、配置文件等狡耻。使用方法是創(chuàng)建一個(gè)JsonParser對象墩剖,然后調(diào)用其parse()方法來解析JSON字符串為一個(gè)JsonElement對象 。
// 創(chuàng)建一個(gè)JsonParser對象夷狰,用于解析JSON數(shù)據(jù)
val jsonParser = JsonParser()
// 使用JsonParser對象的parse()方法來解析JSON字符串為一個(gè)JsonElement對象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對象
-
JsonElement:
這是一個(gè)抽象類岭皂,它是所有JSON元素的基類。它提供了一些通用的方法沼头,如isJsonObject()爷绘、isJsonArray()、isJsonPrimitive()进倍、isJsonNull()等來判斷元素的類型土至,以及getAsJsonObject()、getAsJsonArray()猾昆、getAsJsonPrimitive()陶因、getAsJsonNull()等來獲取元素的具體類型。
// 使用JsonParser對象的parse()方法來解析JSON字符串為一個(gè)JsonElement對象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對象
// 使用JsonElement對象的各種方法垂蜗,將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu)楷扬,每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對象,可以是JsonObject贴见、JsonArray烘苹、JsonPrimitive或JsonNull
if (jsonElement.isJsonObject) { // 判斷是否是一個(gè)JSON對象
val jsonObject = jsonElement.asJsonObject // 獲取JSON對象
if (jsonObject.has("id")) { // 判斷是否有id屬性
val id = jsonObject.get("id").asInt // 獲取id屬性的值
println("id: $id")
}
if (jsonObject.has("name")) { // 判斷是否有name屬性
val name = jsonObject.get("name").asString // 獲取name屬性的值
println("name: $name")
}
if (jsonObject.has("email")) { // 判斷是否有email屬性
val email = jsonObject.get("email").asString // 獲取email屬性的值
println("email: $email")
}
if (jsonObject.has("phone")) { // 判斷是否有phone屬性
val phone = jsonObject.get("phone").asString // 獲取phone屬性的值
println("phone: $phone")
}
}
-
JsonObject:
這是一個(gè)繼承自JsonElement的類,它表示一個(gè)JSON對象蝇刀。它提供了一些操作鍵值對的方法螟加,如add()、remove()吞琐、get()捆探、has()等。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonSerializer<Book> { // 注冊自定義序列化器
override fun serialize(src: Book, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
val jsonObject = JsonObject()
jsonObject.addProperty("id", src.id)
jsonObject.addProperty("title", src.title.toUpperCase()) // 將標(biāo)題轉(zhuǎn)換為大寫
jsonObject.addProperty("author", src.author)
return jsonObject
}
})
-
JsonArray:
這是一個(gè)繼承自JsonElement的類站粟,它表示一個(gè)JSON數(shù)組黍图。它提供了一些操作元素的方法,如add()奴烙、remove()助被、get()剖张、size()等。
- JsonPrimitive:
這是一個(gè)繼承自JsonElement的類揩环,它表示一個(gè)JSON原始值搔弄。它可以是一個(gè)字符串、數(shù)字丰滑、布爾值或空值顾犹。它提供了一些獲取值的方法,如getAsString()褒墨、getAsInt()炫刷、getAsBoolean()等。
- JsonNull:
這是一個(gè)繼承自JsonElement的類郁妈,它表示一個(gè)JSON空值浑玛。它是一個(gè)單例類,只有一個(gè)實(shí)例噩咪。
- InstanceCreator:
這是一個(gè)創(chuàng)建對象實(shí)例的接口顾彰,它可以讓您為特定的類型提供自定義的構(gòu)造方法。它適合處理沒有無參構(gòu)造器或有特殊初始化邏輯的類剧腻,例如抽象類拘央、接口、內(nèi)部類等书在。使用方法是實(shí)現(xiàn)這個(gè)接口灰伟,并重寫createInstance()方法,然后注冊到GsonBuilder中儒旬。
-
JsonSerializer:
這是一個(gè)自定義序列化的接口栏账,它可以讓您為特定的類型提供自定義的序列化方法。它適合處理復(fù)雜的泛型栈源、循環(huán)引用挡爵、動(dòng)態(tài)類型等情況,或者需要修改或增加JSON屬性等情況甚垦。使用方法是實(shí)現(xiàn)這個(gè)接口茶鹃,并重寫serialize()方法,然后注冊到GsonBuilder中艰亮。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonSerializer<Book> { // 注冊自定義序列化器
override fun serialize(src: Book, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
val jsonObject = JsonObject()
jsonObject.addProperty("id", src.id)
jsonObject.addProperty("title", src.title.toUpperCase()) // 將標(biāo)題轉(zhuǎn)換為大寫
jsonObject.addProperty("author", src.author)
return jsonObject
}
})
-
JsonDeserializer:
這是一個(gè)自定義反序列化的接口闭翩,它可以讓您為特定的類型提供自定義的反序列化方法。它適合處理復(fù)雜的泛型迄埃、循環(huán)引用疗韵、動(dòng)態(tài)類型等情況,或者需要驗(yàn)證或轉(zhuǎn)換JSON屬性等情況侄非。使用方法是實(shí)現(xiàn)這個(gè)接口蕉汪,并重寫deserialize()方法流译,然后注冊到GsonBuilder中。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonDeserializer<Book> { // 注冊自定義反序列化器
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Book {
val jsonObject = json.asJsonObject
val id = jsonObject.get("id").asInt
val title = jsonObject.get("title").asString.toLowerCase() // 將標(biāo)題轉(zhuǎn)換為小寫
val author = jsonObject.get("author").asString
return Book(id, title, author)
}
})
-
TypeAdapter:
這是一個(gè)抽象類者疤,它可以讓您完全控制對象和JSON之間的轉(zhuǎn)換過程福澡。它適合處理日期格式、枚舉類型驹马、自定義類型等情況竞漾,或者需要優(yōu)化性能或內(nèi)存消耗等情況。使用方法是繼承這個(gè)類窥翩,并重寫write()和read()方法,然后注冊到GsonBuilder中鳞仙。
// 創(chuàng)建一個(gè)表示顏色的枚舉類Color寇蚊,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
enum class Color {
@TypeAdapter(ColorTypeAdapter::class)
RED,
GREEN,
BLUE
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類,用于控制Color枚舉類和JSON之間的轉(zhuǎn)換過程
class ColorTypeAdapter : TypeAdapter<Color>() {
override fun write(out: JsonWriter, value: Color) {
out.value(value.ordinal) // 將枚舉值轉(zhuǎn)換為整數(shù)值寫入JSON中
}
override fun read(`in`: JsonReader): Color {
return Color.values()[`in`.nextInt()] // 將整數(shù)值從JSON中讀取并轉(zhuǎn)換為枚舉值
}
}
// 創(chuàng)建一個(gè)表示畫筆的類Pen棍好,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
data class Pen(
val brand: String,
val color: Color,
val price: Double
) {
@TypeAdapter(PenTypeAdapter::class)
constructor(json: String) : this("", Color.RED, 0.0) // 使用一個(gè)帶有JSON字符串參數(shù)的構(gòu)造器仗岸,并使用@TypeAdapter注解來指定
// 創(chuàng)建一個(gè)表示顏色的枚舉類Color,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
enum class Color {
@TypeAdapter(ColorTypeAdapter::class)
RED,
GREEN,
BLUE
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類借笙,用于控制Color枚舉類和JSON之間的轉(zhuǎn)換過程
class ColorTypeAdapter : TypeAdapter<Color>() {
override fun write(out: JsonWriter, value: Color) {
out.value(value.ordinal) // 將枚舉值轉(zhuǎn)換為整數(shù)值寫入JSON中
}
override fun read(`in`: JsonReader): Color {
return Color.values()[`in`.nextInt()] // 將整數(shù)值從JSON中讀取并轉(zhuǎn)換為枚舉值
}
}
// 創(chuàng)建一個(gè)表示畫筆的類Pen扒怖,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
data class Pen(
val brand: String,
val color: Color,
val price: Double
) {
@TypeAdapter(PenTypeAdapter::class)
constructor(json: String) : this("", Color.RED, 0.0) // 使用一個(gè)帶有JSON字符串參數(shù)的構(gòu)造器,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類业稼,用于控制Pen類和JSON之間的轉(zhuǎn)換過程
class PenTypeAdapter : TypeAdapter<Pen>() {
override fun write(out: JsonWriter, value: Pen) {
out.beginObject() // 開始寫入一個(gè)JSON對象
out.name("brand").value(value.brand) // 寫入一個(gè)鍵值對盗痒,鍵名為brand,值為畫筆品牌
out.name("color").value(value.color.ordinal) // 寫入一個(gè)鍵值對低散,鍵名為color俯邓,值為畫筆顏色對應(yīng)的整數(shù)值
out.name("price").value(value.price) // 寫入一個(gè)鍵值對,鍵名為price熔号,值為畫筆價(jià)格
out.endObject() // 結(jié)束寫入一個(gè)JSON對象
}
override fun read(`in`: JsonReader): Pen {
var brand = ""
var color = Color.RED
var price = 0.0
`in`.beginObject() // 開始讀取一個(gè)JSON對象
while (`in`.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對
val name = `in`.nextName() // 讀取鍵名
when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
"brand" -> {
brand = `in`.nextString() // 讀取字符串值作為畫筆品牌
}
"color" -> {
color = Color.values()[`in`.nextInt()] // 讀取整數(shù)值并轉(zhuǎn)換為畫筆顏色對應(yīng)的枚舉值
}
"price" -> {
price = `in`.nextDouble() // 讀取浮點(diǎn)數(shù)值作為畫筆價(jià)格
}
else -> {
`in`.skipValue() // 跳過其他值
}
}
}
`in`.endObject() // 結(jié)束讀取一個(gè)JSON對象
return Pen(brand, color, price) // 返回一個(gè)Pen對象
}
}
// 創(chuàng)建一個(gè)Pen對象
val pen = Pen("Pilot", Color.BLUE, 10.0)
// 使用生成的Gson對象的toJson()方法將Pen對象轉(zhuǎn)換為JSON字符串稽鞭,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val json7 = gson2.toJson(pen) // {"brand":"Pilot","color":2,"price":10.0}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Pen對象,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val pen2 = gson2.fromJson(json7, Pen::class.java) // Pen(brand=Pilot, color=BLUE, price=10.0)
// 使用帶有JSON字符串參數(shù)的構(gòu)造器來創(chuàng)建一個(gè)Pen對象引镊,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val pen3 = Pen(json7) // Pen(brand=Pilot, color=BLUE, price=10.0)
- ExclusionStrategy:
這是一個(gè)排除策略的接口朦蕴,它可以讓您根據(jù)一些條件來排除某些字段或類不參與序列化或反序列化。它適合處理不需要暴露或轉(zhuǎn)換的敏感或無關(guān)的數(shù)據(jù)弟头,例如帶有特定注解吩抓、修飾符、名稱等的字段或類亮瓷。使用方法是實(shí)現(xiàn)這個(gè)接口琴拧,并重寫shouldSkipField()和shouldSkipClass()方法,然后注冊到GsonBuilder中嘱支。
gsonBuilder.setExclusionStrategies(object : ExclusionStrategy { // 設(shè)置排除策略
override fun shouldSkipField(f: FieldAttributes): Boolean {
return f.getAnnotation(Exclude::class.java) != null // 排除帶有@Exclude注解的字段
}
override fun shouldSkipClass(clazz: Class<*>): Boolean {
return false // 不排除任何類
}
})
- @SerializedName:這是一個(gè)用于指定字段在JSON中的名稱的注解蚓胸,它可以讓您在序列化和反序列化時(shí)使用不同于字段名的JSON屬性名挣饥。它適合處理字段名和JSON屬性名不一致的情況,例如使用下劃線或駝峰命名法等沛膳。使用方法是在字段上添加@SerializedName注解扔枫,并指定一個(gè)或多個(gè)JSON屬性名。例如:
data class User(
@SerializedName("user_id") val id: Int, // 在JSON中使用user_id而不是id
@SerializedName("user_name", alternate = ["name", "username"]) val name: String // 在JSON中使用user_name锹安,也可以接受name或username作為備選
)
- @Expose:這是一個(gè)用于指定字段是否參與序列化和反序列化的注解短荐,它可以讓您在轉(zhuǎn)換對象和JSON時(shí)忽略某些字段。它適合處理不需要暴露或轉(zhuǎn)換的敏感或無關(guān)的數(shù)據(jù)叹哭,例如密碼忍宋、日志、緩存等风罩。使用方法是在字段上添加@Expose注解糠排,并指定serialize和deserialize屬性為true或false。例如:
data class User(
@Expose(serialize = true, deserialize = true) val id: Int, // 參與序列化和反序列化
@Expose(serialize = false, deserialize = false) val password: String, // 不參與序列化和反序列化
@Expose(serialize = true, deserialize = false) val token: String // 只參與序列化
)
- @Since:這是一個(gè)用于指定字段的版本號的注解超升,它可以讓您根據(jù)不同的版本號來選擇性地轉(zhuǎn)換對象和JSON入宦。它適合處理數(shù)據(jù)結(jié)構(gòu)隨著版本變化而變化的情況,例如添加室琢、刪除乾闰、修改字段等。使用方法是在字段上添加@Since注解盈滴,并指定一個(gè)double類型的版本號涯肩。例如:
data class User(
@Since(1.0) val id: Int, // 從1.0版本開始存在
@Since(1.1) val name: String, // 從1.1版本開始存在
@Since(2.0) val email: String // 從2.0版本開始存在
)
- @Until:這是一個(gè)用于指定字段的過期版本號的注解,它可以讓您根據(jù)不同的版本號來選擇性地轉(zhuǎn)換對象和JSON巢钓。它適合處理數(shù)據(jù)結(jié)構(gòu)隨著版本變化而變化的情況宽菜,例如添加、刪除竿报、修改字段等铅乡。使用方法是在字段上添加@Until注解,并指定一個(gè)double類型的版本號烈菌。例如:
data class User(
@Until(2.0) val id: Int, // 直到2.0版本之前存在
@Until(3.0) val name: String, // 直到3.0版本之前存在
val email: String // 沒有過期版本號
)
整體代碼
// 創(chuàng)建一個(gè)Gson對象
val gson = Gson()
// 創(chuàng)建一個(gè)表示用戶的類User
data class User(
val id: Int,
val name: String,
val email: String,
val phone: String
)
// 創(chuàng)建一個(gè)User對象
val user = User(1, "Alice", "alice@gmail.com", "1234567890")
// 使用Gson對象的toJson()方法將User對象轉(zhuǎn)換為JSON字符串
val json = gson.toJson(user) // {"id":1,"name":"Alice","email":"alice@gmail.com","phone":"1234567890"}
// 使用Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為User對象
val user2 = gson.fromJson(json, User::class.java) // User(id=1, name=Alice, email=alice@gmail.com, phone=1234567890)
// 創(chuàng)建一個(gè)GsonBuilder對象
val gsonBuilder = GsonBuilder()
// 使用GsonBuilder對象的各種設(shè)置方法來定制Gson的行為和特性阵幸,例如設(shè)置日期格式、排除策略芽世、版本控制挚赊、自定義序列化和反序列化等
gsonBuilder.setDateFormat("yyyy-MM-dd") // 設(shè)置日期格式
gsonBuilder.setExclusionStrategies(object : ExclusionStrategy { // 設(shè)置排除策略
override fun shouldSkipField(f: FieldAttributes): Boolean {
return f.getAnnotation(Exclude::class.java) != null // 排除帶有@Exclude注解的字段
}
override fun shouldSkipClass(clazz: Class<*>): Boolean {
return false // 不排除任何類
}
})
gsonBuilder.setVersion(2.0) // 設(shè)置版本控制
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonSerializer<Book> { // 注冊自定義序列化器
override fun serialize(src: Book, typeOfSrc: Type, context: JsonSerializationContext): JsonElement {
val jsonObject = JsonObject()
jsonObject.addProperty("id", src.id)
jsonObject.addProperty("title", src.title.toUpperCase()) // 將標(biāo)題轉(zhuǎn)換為大寫
jsonObject.addProperty("author", src.author)
return jsonObject
}
})
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonDeserializer<Book> { // 注冊自定義反序列化器
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Book {
val jsonObject = json.asJsonObject
val id = jsonObject.get("id").asInt
val title = jsonObject.get("title").asString.toLowerCase() // 將標(biāo)題轉(zhuǎn)換為小寫
val author = jsonObject.get("author").asString
return Book(id, title, author)
}
})
// 使用GsonBuilder對象的create()方法來生成一個(gè)Gson對象
val gson2 = gsonBuilder.create()
// 使用生成的Gson對象來轉(zhuǎn)換對象和JSON,根據(jù)定制的行為和特性進(jìn)行轉(zhuǎn)換
// 創(chuàng)建一個(gè)表示書籍的類Book济瓢,并使用@Since和@Until注解來指定版本號
data class Book(
@Since(1.0) @Until(2.0) val id: Int,
@Since(1.1) @Until(3.0) val title: String,
val author: String
)
// 創(chuàng)建一個(gè)Book對象
val book = Book(1, "Kotlin in Action", "Dmitry Jemerov")
// 使用生成的Gson對象的toJson()方法將Book對象轉(zhuǎn)換為JSON字符串荠割,根據(jù)版本號來選擇性地轉(zhuǎn)換字段
val json2 = gson2.toJson(book) // {"title":"KOTLIN IN ACTION","author":"Dmitry Jemerov"}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Book對象,根據(jù)版本號和自定義反序列化器來選擇性地轉(zhuǎn)換屬性
val book2 = gson2.fromJson(json2, Book::class.java) // Book(id=0, title=kotlin in action, author=Dmitry Jemerov)
// 創(chuàng)建一個(gè)表示日期的Date對象
val date = Date()
// 使用生成的Gson對象的toJson()方法將Date對象轉(zhuǎn)換為JSON字符串,根據(jù)日期格式來轉(zhuǎn)換值
val json3 = gson2.toJson(date) // "2023-04-15"
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Date對象蔑鹦,根據(jù)日期格式來轉(zhuǎn)換值
val date2 = gson2.fromJson(json3, Date::class.java) // Sat Apr 15 00:00:00 GMT+08:00 2023
// 創(chuàng)建一個(gè)表示學(xué)生的類Student夺克,并使用@SerializedName注解來指定字段在JSON中的名稱
data class Student(
@SerializedName("student_id") val id: Int,
@SerializedName("student_name") val name: String,
val age: Int
)
// 創(chuàng)建一個(gè)Student對象
val student = Student(1, "Bob", 18)
// 使用生成的Gson對象的toJson()方法將Student對象轉(zhuǎn)換為JSON字符串,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val json4 = gson2.toJson(student) // {"student_id":1,"student_name":"Bob","age":18}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Student對象嚎朽,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val student2 = gson2.fromJson(json4, Student::class.java) // Student(id=1, name=Bob, age=18)
// 創(chuàng)建一個(gè)表示員工的類Employee铺纽,并使用@Expose注解來指定字段是否參與序列化和反序列化
data class Employee(
@Expose(serialize = true, deserialize = true) val id: Int,
@Expose(serialize = false, deserialize = false) val password: String,
@Expose(serialize = true, deserialize = false) val token: String
)
// 創(chuàng)建一個(gè)Employee對象
val employee = Employee(1, "123456", "abcdef")
// 使用生成的Gson對象的toJson()方法將Employee對象轉(zhuǎn)換為JSON字符串,根據(jù)@Expose注解來忽略某些字段
val json5 = gson2.toJson(employee) // {"id":1,"token":"abcdef"}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Employee對象哟忍,根據(jù)@Expose注解來忽略某些字段
val employee2 = gson2.fromJson(json5, Employee::class.java) // Employee(id=1, password=null, token=null)
// 創(chuàng)建一個(gè)JsonReader對象狡门,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)
// 使用JsonReader對象的各種讀取方法,以流式的方式讀取JSON數(shù)據(jù)锅很,而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對
val name = jsonReader.nextName() // 讀取鍵名
when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
"id" -> {
val id = jsonReader.nextInt() // 讀取整數(shù)值
println("id: $id")
}
"name" -> {
val name = jsonReader.nextString() // 讀取字符串值
println("name: $name")
}
"email" -> {
val email = jsonReader.nextString() // 讀取字符串值
println("email: $email")
}
"phone" -> {
val phone = jsonReader.nextString() // 讀取字符串值
println("phone: $phone")
}
else -> {
jsonReader.skipValue() // 跳過其他值
}
}
}
jsonReader.endObject() // 結(jié)束讀取一個(gè)JSON對象
// 創(chuàng)建一個(gè)JsonWriter對象其馏,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中
// 使用JsonWriter對象的各種寫入方法,以流式的方式寫入JSON數(shù)據(jù)爆安,而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對尝偎,鍵名為id,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對鹏控,鍵名為name,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對肤寝,鍵名為email当辐,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對,鍵名為phone鲤看,值為1234567890
jsonWriter.endObject() // 結(jié)束寫
// 創(chuàng)建一個(gè)表示學(xué)生的類Student缘揪,并使用@SerializedName注解來指定字段在JSON中的名稱
data class Student(
@SerializedName("student_id") val id: Int,
@SerializedName("student_name") val name: String,
val age: Int
)
// 創(chuàng)建一個(gè)Student對象
val student = Student(1, "Bob", 18)
// 使用生成的Gson對象的toJson()方法將Student對象轉(zhuǎn)換為JSON字符串,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val json4 = gson2.toJson(student) // {"student_id":1,"student_name":"Bob","age":18}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Student對象义桂,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val student2 = gson2.fromJson(json4, Student::class.java) // Student(id=1, name=Bob, age=18)
// 創(chuàng)建一個(gè)表示員工的類Employee找筝,并使用@Expose注解來指定字段是否參與序列化和反序列化
data class Employee(
@Expose(serialize = true, deserialize = true) val id: Int,
@Expose(serialize = false, deserialize = false) val password: String,
@Expose(serialize = true, deserialize = false) val token: String
)
// 創(chuàng)建一個(gè)Employee對象
val employee = Employee(1, "123456", "abcdef")
// 使用生成的Gson對象的toJson()方法將Employee對象轉(zhuǎn)換為JSON字符串,根據(jù)@Expose注解來忽略某些字段
val json5 = gson2.toJson(employee) // {"id":1,"token":"abcdef"}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Employee對象慷吊,根據(jù)@Expose注解來忽略某些字段
val employee2 = gson2.fromJson(json5, Employee::class.java) // Employee(id=1, password=null, token=null)
// 創(chuàng)建一個(gè)JsonReader對象袖裕,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)
// 使用JsonReader對象的各種讀取方法,以流式的方式讀取JSON數(shù)據(jù)溉瓶,而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對
val name = jsonReader.nextName() // 讀取鍵名
when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
"id" -> {
val id = jsonReader.nextInt() // 讀取整數(shù)值
println("id: $id")
}
"name" -> {
val name = jsonReader.nextString() // 讀取字符串值
println("name: $name")
}
"email" -> {
val email = jsonReader.nextString() // 讀取字符串值
println("email: $email")
}
"phone" -> {
val phone = jsonReader.nextString() // 讀取字符串值
println("phone: $phone")
}
else -> {
jsonReader.skipValue() // 跳過其他值
}
}
}
jsonReader.endObject() // 結(jié)束讀取一個(gè)JSON對象
// 創(chuàng)建一個(gè)JsonWriter對象急鳄,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中
// 使用JsonWriter對象的各種寫入方法,以流式的方式寫入JSON數(shù)據(jù)堰酿,而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對疾宏,鍵名為id,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對触创,鍵名為name坎藐,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對,鍵名為email哼绑,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對岩馍,鍵名為phone碉咆,值為1234567890
jsonWriter.endObject() // 結(jié)束寫入一個(gè)JSON對象
// 創(chuàng)建一個(gè)JsonParser對象,用于解析JSON數(shù)據(jù)
val jsonParser = JsonParser()
// 使用JsonParser對象的parse()方法來解析JSON字符串為一個(gè)JsonElement對象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對象
// 使用JsonElement對象的各種方法兼雄,將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu)吟逝,每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對象,可以是JsonObject赦肋、JsonArray块攒、JsonPrimitive或JsonNull
if (jsonElement.isJsonObject) { // 判斷是否是一個(gè)JSON對象
val jsonObject = jsonElement.asJsonObject // 獲取JSON對象
if (jsonObject.has("id")) { // 判斷是否有id屬性
val id = jsonObject.get("id").asInt // 獲取id屬性的值
println("id: $id")
}
if (jsonObject.has("name")) { // 判斷是否有name屬性
val name = jsonObject.get("name").asString // 獲取name屬性的值
println("name: $name")
}
if (jsonObject.has("email")) { // 判斷是否有email屬性
val email = jsonObject.get("email").asString // 獲取email屬性的值
println("email: $email")
}
if (jsonObject.has("phone")) { // 判斷是否有phone屬性
val phone = jsonObject.get("phone").asString // 獲取phone屬性的值
println("phone: $phone")
}
}
// 創(chuàng)建一個(gè)表示圖書館的類Library,并使用@Expose注解來指定字段是否參與序列化和反序列化佃乘,使用@SerializedName注解來指定字段在JSON中的名稱囱井,使用@Since和@Until注解來指定字段的版本號
data class Library(
@Expose(serialize = true, deserialize = true) @SerializedName("library_id") @Since(1.0) @Until(2.0) val id: Int,
@Expose(serialize = true, deserialize = true) @SerializedName("library_name") @Since(1.1) @Until(3.0) val name: String,
@Expose(serialize = false, deserialize = false) @SerializedName("library_password") val password: String,
@Expose(serialize = true, deserialize = false) @SerializedName("library_token") val token: String,
val books: List<Book>
)
// 創(chuàng)建一個(gè)Library對象
val library = Library(1, "My Library", "123456", "abcdef", listOf(book, book2))
// 使用生成的Gson對象的toJson()方法將Library對象轉(zhuǎn)換為JSON字符串,根據(jù)各種注解來定制轉(zhuǎn)換過程
val json6 = gson2.toJson(library) // {"library_name":"MY LIBRARY","library_token":"abcdef","books":[{"title":"KOTLIN IN ACTION","author":"Dmitry Jemerov"}]}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Library對象趣避,根據(jù)各種注解來定制轉(zhuǎn)換過程
val library2 = gson2.fromJson(json6, Library::class.java) // Library(id=0, name=MY LIBRARY, password=null, token=null, books=[Book(id=0, title=kotlin in action, author=Dmitry Jemerov)])
// 創(chuàng)建一個(gè)表示顏色的枚舉類Color庞呕,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
enum class Color {
@TypeAdapter(ColorTypeAdapter::class)
RED,
GREEN,
BLUE
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類,用于控制Color枚舉類和JSON之間的轉(zhuǎn)換過程
class ColorTypeAdapter : TypeAdapter<Color>() {
override fun write(out: JsonWriter, value: Color) {
out.value(value.ordinal) // 將枚舉值轉(zhuǎn)換為整數(shù)值寫入JSON中
}
override fun read(`in`: JsonReader): Color {
return Color.values()[`in`.nextInt()] // 將整數(shù)值從JSON中讀取并轉(zhuǎn)換為枚舉值
}
}
// 創(chuàng)建一個(gè)表示畫筆的類Pen程帕,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
data class Pen(
val brand: String,
val color: Color,
val price: Double
) {
@TypeAdapter(PenTypeAdapter::class)
constructor(json: String) : this("", Color.RED, 0.0) // 使用一個(gè)帶有JSON字符串參數(shù)的構(gòu)造器住练,并使用@TypeAdapter注解來指定
// 創(chuàng)建一個(gè)表示顏色的枚舉類Color,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
enum class Color {
@TypeAdapter(ColorTypeAdapter::class)
RED,
GREEN,
BLUE
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類愁拭,用于控制Color枚舉類和JSON之間的轉(zhuǎn)換過程
class ColorTypeAdapter : TypeAdapter<Color>() {
override fun write(out: JsonWriter, value: Color) {
out.value(value.ordinal) // 將枚舉值轉(zhuǎn)換為整數(shù)值寫入JSON中
}
override fun read(`in`: JsonReader): Color {
return Color.values()[`in`.nextInt()] // 將整數(shù)值從JSON中讀取并轉(zhuǎn)換為枚舉值
}
}
// 創(chuàng)建一個(gè)表示畫筆的類Pen讲逛,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
data class Pen(
val brand: String,
val color: Color,
val price: Double
) {
@TypeAdapter(PenTypeAdapter::class)
constructor(json: String) : this("", Color.RED, 0.0) // 使用一個(gè)帶有JSON字符串參數(shù)的構(gòu)造器,并使用@TypeAdapter注解來指定自定義的TypeAdapter類
}
// 創(chuàng)建一個(gè)自定義的TypeAdapter類岭埠,用于控制Pen類和JSON之間的轉(zhuǎn)換過程
class PenTypeAdapter : TypeAdapter<Pen>() {
override fun write(out: JsonWriter, value: Pen) {
out.beginObject() // 開始寫入一個(gè)JSON對象
out.name("brand").value(value.brand) // 寫入一個(gè)鍵值對盏混,鍵名為brand,值為畫筆品牌
out.name("color").value(value.color.ordinal) // 寫入一個(gè)鍵值對惜论,鍵名為color许赃,值為畫筆顏色對應(yīng)的整數(shù)值
out.name("price").value(value.price) // 寫入一個(gè)鍵值對,鍵名為price馆类,值為畫筆價(jià)格
out.endObject() // 結(jié)束寫入一個(gè)JSON對象
}
override fun read(`in`: JsonReader): Pen {
var brand = ""
var color = Color.RED
var price = 0.0
`in`.beginObject() // 開始讀取一個(gè)JSON對象
while (`in`.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對
val name = `in`.nextName() // 讀取鍵名
when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
"brand" -> {
brand = `in`.nextString() // 讀取字符串值作為畫筆品牌
}
"color" -> {
color = Color.values()[`in`.nextInt()] // 讀取整數(shù)值并轉(zhuǎn)換為畫筆顏色對應(yīng)的枚舉值
}
"price" -> {
price = `in`.nextDouble() // 讀取浮點(diǎn)數(shù)值作為畫筆價(jià)格
}
else -> {
`in`.skipValue() // 跳過其他值
}
}
}
`in`.endObject() // 結(jié)束讀取一個(gè)JSON對象
return Pen(brand, color, price) // 返回一個(gè)Pen對象
}
}
// 創(chuàng)建一個(gè)Pen對象
val pen = Pen("Pilot", Color.BLUE, 10.0)
// 使用生成的Gson對象的toJson()方法將Pen對象轉(zhuǎn)換為JSON字符串混聊,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val json7 = gson2.toJson(pen) // {"brand":"Pilot","color":2,"price":10.0}
// 使用生成的Gson對象的fromJson()方法將JSON字符串轉(zhuǎn)換為Pen對象,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val pen2 = gson2.fromJson(json7, Pen::class.java) // Pen(brand=Pilot, color=BLUE, price=10.0)
// 使用帶有JSON字符串參數(shù)的構(gòu)造器來創(chuàng)建一個(gè)Pen對象乾巧,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val pen3 = Pen(json7) // Pen(brand=Pilot, color=BLUE, price=10.0)