GSON的各種使用方式

  • Gson
    這是Gson的核心類,它可以將對(duì)象轉(zhuǎn)換為JSON字符串,或者將JSON字符串轉(zhuǎn)換為對(duì)象。它使用反射機(jī)制來自動(dòng)匹配對(duì)象的字段和JSON的屬性,不需要額外的配置或注解。它適合處理簡(jiǎn)單和穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),例如用戶信息、商品列表等。使用方法是創(chuàng)建一個(gè)Gson對(duì)象,然后調(diào)用其toJson()和fromJson()方法。
// 創(chuàng)建一個(gè)Gson對(duì)象
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對(duì)象
val user = User(1, "Alice", "alice@gmail.com", "1234567890")

// 使用Gson對(duì)象的toJson()方法將User對(duì)象轉(zhuǎn)換為JSON字符串
val json = gson.toJson(user) // {"id":1,"name":"Alice","email":"alice@gmail.com","phone":"1234567890"}

// 使用Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為User對(duì)象
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對(duì)象,然后調(diào)用其各種設(shè)置方法,最后調(diào)用其create()方法來生成一個(gè)Gson對(duì)象。

// 創(chuàng)建一個(gè)GsonBuilder對(duì)象
val gsonBuilder = GsonBuilder()

//省略配置代碼

// 使用GsonBuilder對(duì)象的create()方法來生成一個(gè)Gson對(duì)象
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對(duì)象,然后調(diào)用其各種讀取方法,如beginObject()、endObject()、nextName()、nextString()等。
// 創(chuàng)建一個(gè)JsonReader對(duì)象,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)

// 使用JsonReader對(duì)象的各種讀取方法,以流式的方式讀取JSON數(shù)據(jù),而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對(duì)象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對(duì)
    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對(duì)象
  • JsonWriter
    這是一個(gè)寫入JSON數(shù)據(jù)的類,它可以讓您以流式的方式寫入JSON數(shù)據(jù),而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對(duì)象。它適合處理大型和未知的JSON數(shù)據(jù),例如網(wǎng)絡(luò)請(qǐng)求、日志文件等。使用方法是創(chuàng)建一個(gè)JsonWriter對(duì)象,然后調(diào)用其各種寫入方法,如beginObject()、endObject()、name()、value()等。
// 創(chuàng)建一個(gè)JsonWriter對(duì)象,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中

// 使用JsonWriter對(duì)象的各種寫入方法,以流式的方式寫入JSON數(shù)據(jù),而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對(duì)象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對(duì)象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對(duì),鍵名為id,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對(duì),鍵名為name,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對(duì),鍵名為email,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對(duì),鍵名為phone,值為1234567890
jsonWriter.endObject() // 結(jié)束寫
  • JsonParser
    這是一個(gè)解析JSON數(shù)據(jù)的類,它可以讓您將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對(duì)象,可以是JsonObject、JsonArray、JsonPrimitive或JsonNull。它適合處理動(dòng)態(tài)和不規(guī)則的JSON數(shù)據(jù),例如用戶輸入、配置文件等。使用方法是創(chuàng)建一個(gè)JsonParser對(duì)象,然后調(diào)用其parse()方法來解析JSON字符串為一個(gè)JsonElement對(duì)象 。
// 創(chuàng)建一個(gè)JsonParser對(duì)象,用于解析JSON數(shù)據(jù)
val jsonParser = JsonParser()

// 使用JsonParser對(duì)象的parse()方法來解析JSON字符串為一個(gè)JsonElement對(duì)象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對(duì)象
  • JsonElement
    這是一個(gè)抽象類,它是所有JSON元素的基類。它提供了一些通用的方法,如isJsonObject()、isJsonArray()、isJsonPrimitive()、isJsonNull()等來判斷元素的類型,以及getAsJsonObject()、getAsJsonArray()、getAsJsonPrimitive()、getAsJsonNull()等來獲取元素的具體類型。
// 使用JsonParser對(duì)象的parse()方法來解析JSON字符串為一個(gè)JsonElement對(duì)象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對(duì)象

// 使用JsonElement對(duì)象的各種方法,將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對(duì)象,可以是JsonObject、JsonArray、JsonPrimitive或JsonNull
if (jsonElement.isJsonObject) { // 判斷是否是一個(gè)JSON對(duì)象
    val jsonObject = jsonElement.asJsonObject // 獲取JSON對(duì)象
    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對(duì)象。它提供了一些操作鍵值對(duì)的方法,如add()、remove()、get()、has()等。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonSerializer<Book> { // 注冊(cè)自定義序列化器
    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)建對(duì)象實(shí)例的接口,它可以讓您為特定的類型提供自定義的構(gòu)造方法。它適合處理沒有無參構(gòu)造器或有特殊初始化邏輯的類,例如抽象類、接口、內(nèi)部類等。使用方法是實(shí)現(xiàn)這個(gè)接口,并重寫createInstance()方法,然后注冊(cè)到GsonBuilder中。

  • JsonSerializer
    這是一個(gè)自定義序列化的接口,它可以讓您為特定的類型提供自定義的序列化方法。它適合處理復(fù)雜的泛型、循環(huán)引用、動(dòng)態(tài)類型等情況,或者需要修改或增加JSON屬性等情況。使用方法是實(shí)現(xiàn)這個(gè)接口,并重寫serialize()方法,然后注冊(cè)到GsonBuilder中。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonSerializer<Book> { // 注冊(cè)自定義序列化器
    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()方法,然后注冊(cè)到GsonBuilder中。
gsonBuilder.registerTypeAdapter(Book::class.java, object : JsonDeserializer<Book> { // 注冊(cè)自定義反序列化器
    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è)抽象類,它可以讓您完全控制對(duì)象和JSON之間的轉(zhuǎn)換過程。它適合處理日期格式、枚舉類型、自定義類型等情況,或者需要優(yōu)化性能或內(nèi)存消耗等情況。使用方法是繼承這個(gè)類,并重寫write()和read()方法,然后注冊(cè)到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對(duì)象
        out.name("brand").value(value.brand) // 寫入一個(gè)鍵值對(duì),鍵名為brand,值為畫筆品牌
        out.name("color").value(value.color.ordinal) // 寫入一個(gè)鍵值對(duì),鍵名為color,值為畫筆顏色對(duì)應(yīng)的整數(shù)值
        out.name("price").value(value.price) // 寫入一個(gè)鍵值對(duì),鍵名為price,值為畫筆價(jià)格
        out.endObject() // 結(jié)束寫入一個(gè)JSON對(duì)象
    }

    override fun read(`in`: JsonReader): Pen {
        var brand = ""
        var color = Color.RED
        var price = 0.0
        `in`.beginObject() // 開始讀取一個(gè)JSON對(duì)象
        while (`in`.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對(duì)
            val name = `in`.nextName() // 讀取鍵名
            when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
                "brand" -> {
                    brand = `in`.nextString() // 讀取字符串值作為畫筆品牌
                }
                "color" -> {
                    color = Color.values()[`in`.nextInt()] // 讀取整數(shù)值并轉(zhuǎn)換為畫筆顏色對(duì)應(yīng)的枚舉值
                }
                "price" -> {
                    price = `in`.nextDouble() // 讀取浮點(diǎn)數(shù)值作為畫筆價(jià)格
                }
                else -> {
                    `in`.skipValue() // 跳過其他值
                }
            }
        }
        `in`.endObject() // 結(jié)束讀取一個(gè)JSON對(duì)象
        return Pen(brand, color, price) // 返回一個(gè)Pen對(duì)象
    }
}

// 創(chuàng)建一個(gè)Pen對(duì)象
val pen = Pen("Pilot", Color.BLUE, 10.0)

// 使用生成的Gson對(duì)象的toJson()方法將Pen對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val json7 = gson2.toJson(pen) // {"brand":"Pilot","color":2,"price":10.0}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Pen對(duì)象,根據(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對(duì)象,根據(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()方法,然后注冊(cè)到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)換對(duì)象和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è)用于指定字段的版本號(hào)的注解,它可以讓您根據(jù)不同的版本號(hào)來選擇性地轉(zhuǎn)換對(duì)象和JSON。它適合處理數(shù)據(jù)結(jié)構(gòu)隨著版本變化而變化的情況,例如添加、刪除、修改字段等。使用方法是在字段上添加@Since注解,并指定一個(gè)double類型的版本號(hào)。例如:
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è)用于指定字段的過期版本號(hào)的注解,它可以讓您根據(jù)不同的版本號(hào)來選擇性地轉(zhuǎn)換對(duì)象和JSON。它適合處理數(shù)據(jù)結(jié)構(gòu)隨著版本變化而變化的情況,例如添加、刪除、修改字段等。使用方法是在字段上添加@Until注解,并指定一個(gè)double類型的版本號(hào)。例如:
data class User(
    @Until(2.0) val id: Int, // 直到2.0版本之前存在
    @Until(3.0) val name: String, // 直到3.0版本之前存在
    val email: String // 沒有過期版本號(hào)
)

整體代碼

// 創(chuàng)建一個(gè)Gson對(duì)象
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對(duì)象
val user = User(1, "Alice", "alice@gmail.com", "1234567890")

// 使用Gson對(duì)象的toJson()方法將User對(duì)象轉(zhuǎn)換為JSON字符串
val json = gson.toJson(user) // {"id":1,"name":"Alice","email":"alice@gmail.com","phone":"1234567890"}

// 使用Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為User對(duì)象
val user2 = gson.fromJson(json, User::class.java) // User(id=1, name=Alice, email=alice@gmail.com, phone=1234567890)

// 創(chuàng)建一個(gè)GsonBuilder對(duì)象
val gsonBuilder = GsonBuilder()

// 使用GsonBuilder對(duì)象的各種設(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> { // 注冊(cè)自定義序列化器
    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> { // 注冊(cè)自定義反序列化器
    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對(duì)象的create()方法來生成一個(gè)Gson對(duì)象
val gson2 = gsonBuilder.create()

// 使用生成的Gson對(duì)象來轉(zhuǎn)換對(duì)象和JSON,根據(jù)定制的行為和特性進(jìn)行轉(zhuǎn)換

// 創(chuàng)建一個(gè)表示書籍的類Book,并使用@Since和@Until注解來指定版本號(hào)
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對(duì)象
val book = Book(1, "Kotlin in Action", "Dmitry Jemerov")

// 使用生成的Gson對(duì)象的toJson()方法將Book對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)版本號(hào)來選擇性地轉(zhuǎn)換字段
val json2 = gson2.toJson(book) // {"title":"KOTLIN IN ACTION","author":"Dmitry Jemerov"}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Book對(duì)象,根據(jù)版本號(hào)和自定義反序列化器來選擇性地轉(zhuǎn)換屬性
val book2 = gson2.fromJson(json2, Book::class.java) // Book(id=0, title=kotlin in action, author=Dmitry Jemerov)

// 創(chuàng)建一個(gè)表示日期的Date對(duì)象
val date = Date()

// 使用生成的Gson對(duì)象的toJson()方法將Date對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)日期格式來轉(zhuǎn)換值
val json3 = gson2.toJson(date) // "2023-04-15"

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Date對(duì)象,根據(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對(duì)象
val student = Student(1, "Bob", 18)

// 使用生成的Gson對(duì)象的toJson()方法將Student對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val json4 = gson2.toJson(student) // {"student_id":1,"student_name":"Bob","age":18}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Student對(duì)象,根據(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對(duì)象
val employee = Employee(1, "123456", "abcdef")

// 使用生成的Gson對(duì)象的toJson()方法將Employee對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@Expose注解來忽略某些字段
val json5 = gson2.toJson(employee) // {"id":1,"token":"abcdef"}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Employee對(duì)象,根據(jù)@Expose注解來忽略某些字段
val employee2 = gson2.fromJson(json5, Employee::class.java) // Employee(id=1, password=null, token=null)

// 創(chuàng)建一個(gè)JsonReader對(duì)象,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)

// 使用JsonReader對(duì)象的各種讀取方法,以流式的方式讀取JSON數(shù)據(jù),而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對(duì)象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對(duì)
    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對(duì)象

// 創(chuàng)建一個(gè)JsonWriter對(duì)象,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中

// 使用JsonWriter對(duì)象的各種寫入方法,以流式的方式寫入JSON數(shù)據(jù),而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對(duì)象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對(duì)象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對(duì),鍵名為id,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對(duì),鍵名為name,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對(duì),鍵名為email,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對(duì),鍵名為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對(duì)象
val student = Student(1, "Bob", 18)

// 使用生成的Gson對(duì)象的toJson()方法將Student對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@SerializedName注解來使用不同于字段名的JSON屬性名
val json4 = gson2.toJson(student) // {"student_id":1,"student_name":"Bob","age":18}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Student對(duì)象,根據(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對(duì)象
val employee = Employee(1, "123456", "abcdef")

// 使用生成的Gson對(duì)象的toJson()方法將Employee對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@Expose注解來忽略某些字段
val json5 = gson2.toJson(employee) // {"id":1,"token":"abcdef"}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Employee對(duì)象,根據(jù)@Expose注解來忽略某些字段
val employee2 = gson2.fromJson(json5, Employee::class.java) // Employee(id=1, password=null, token=null)

// 創(chuàng)建一個(gè)JsonReader對(duì)象,用于讀取JSON數(shù)據(jù)
val jsonReader = JsonReader(FileReader("test.json")) // 從文件中讀取JSON數(shù)據(jù)

// 使用JsonReader對(duì)象的各種讀取方法,以流式的方式讀取JSON數(shù)據(jù),而不需要將整個(gè)JSON文檔加載到內(nèi)存中
jsonReader.beginObject() // 開始讀取一個(gè)JSON對(duì)象
while (jsonReader.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對(duì)
    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對(duì)象

// 創(chuàng)建一個(gè)JsonWriter對(duì)象,用于寫入JSON數(shù)據(jù)
val jsonWriter = JsonWriter(FileWriter("test.json")) // 寫入JSON數(shù)據(jù)到文件中

// 使用JsonWriter對(duì)象的各種寫入方法,以流式的方式寫入JSON數(shù)據(jù),而不需要?jiǎng)?chuàng)建一個(gè)完整的JSON對(duì)象
jsonWriter.beginObject() // 開始寫入一個(gè)JSON對(duì)象
jsonWriter.name("id").value(1) // 寫入一個(gè)鍵值對(duì),鍵名為id,值為1
jsonWriter.name("name").value("Alice") // 寫入一個(gè)鍵值對(duì),鍵名為name,值為Alice
jsonWriter.name("email").value("alice@gmail.com") // 寫入一個(gè)鍵值對(duì),鍵名為email,值為alice@gmail.com
jsonWriter.name("phone").value("1234567890") // 寫入一個(gè)鍵值對(duì),鍵名為phone,值為1234567890
jsonWriter.endObject() // 結(jié)束寫入一個(gè)JSON對(duì)象

// 創(chuàng)建一個(gè)JsonParser對(duì)象,用于解析JSON數(shù)據(jù)
val jsonParser = JsonParser()

// 使用JsonParser對(duì)象的parse()方法來解析JSON字符串為一個(gè)JsonElement對(duì)象
val jsonElement = jsonParser.parse(json) // 解析JSON字符串為一個(gè)JsonElement對(duì)象

// 使用JsonElement對(duì)象的各種方法,將JSON數(shù)據(jù)表示為一棵樹狀的結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是一個(gè)JsonElement對(duì)象,可以是JsonObject、JsonArray、JsonPrimitive或JsonNull
if (jsonElement.isJsonObject) { // 判斷是否是一個(gè)JSON對(duì)象
    val jsonObject = jsonElement.asJsonObject // 獲取JSON對(duì)象
    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注解來指定字段的版本號(hào)
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對(duì)象
val library = Library(1, "My Library", "123456", "abcdef", listOf(book, book2))

// 使用生成的Gson對(duì)象的toJson()方法將Library對(duì)象轉(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對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為L(zhǎng)ibrary對(duì)象,根據(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對(duì)象
        out.name("brand").value(value.brand) // 寫入一個(gè)鍵值對(duì),鍵名為brand,值為畫筆品牌
        out.name("color").value(value.color.ordinal) // 寫入一個(gè)鍵值對(duì),鍵名為color,值為畫筆顏色對(duì)應(yīng)的整數(shù)值
        out.name("price").value(value.price) // 寫入一個(gè)鍵值對(duì),鍵名為price,值為畫筆價(jià)格
        out.endObject() // 結(jié)束寫入一個(gè)JSON對(duì)象
    }

    override fun read(`in`: JsonReader): Pen {
        var brand = ""
        var color = Color.RED
        var price = 0.0
        `in`.beginObject() // 開始讀取一個(gè)JSON對(duì)象
        while (`in`.hasNext()) { // 循環(huán)讀取每個(gè)鍵值對(duì)
            val name = `in`.nextName() // 讀取鍵名
            when (name) { // 根據(jù)鍵名判斷值的類型和處理邏輯
                "brand" -> {
                    brand = `in`.nextString() // 讀取字符串值作為畫筆品牌
                }
                "color" -> {
                    color = Color.values()[`in`.nextInt()] // 讀取整數(shù)值并轉(zhuǎn)換為畫筆顏色對(duì)應(yīng)的枚舉值
                }
                "price" -> {
                    price = `in`.nextDouble() // 讀取浮點(diǎn)數(shù)值作為畫筆價(jià)格
                }
                else -> {
                    `in`.skipValue() // 跳過其他值
                }
            }
        }
        `in`.endObject() // 結(jié)束讀取一個(gè)JSON對(duì)象
        return Pen(brand, color, price) // 返回一個(gè)Pen對(duì)象
    }
}

// 創(chuàng)建一個(gè)Pen對(duì)象
val pen = Pen("Pilot", Color.BLUE, 10.0)

// 使用生成的Gson對(duì)象的toJson()方法將Pen對(duì)象轉(zhuǎn)換為JSON字符串,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val json7 = gson2.toJson(pen) // {"brand":"Pilot","color":2,"price":10.0}

// 使用生成的Gson對(duì)象的fromJson()方法將JSON字符串轉(zhuǎn)換為Pen對(duì)象,根據(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對(duì)象,根據(jù)@TypeAdapter注解和自定義的TypeAdapter類來控制轉(zhuǎn)換過程
val pen3 = Pen(json7) // Pen(brand=Pilot, color=BLUE, price=10.0)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)自:http://www.itdecent.cn/p/3108f1e44155?nomobile=yes 該系列...
    逍遙游lx閱讀 1,221評(píng)論 0 2
  • 1.概述2.Gson的目標(biāo)3.Gson的性能和擴(kuò)展性4.Gson的使用者5.如何使用Gson 通過Maven來使用...
    人失格閱讀 14,553評(píng)論 2 18
  • 本文為作者根據(jù)日常使用結(jié)合Gson源碼注釋及wiki所作的原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處。 該系列其它文章 你真的會(huì)用G...
    怪盜kidou閱讀 78,767評(píng)論 119 213
  • Json 是一種文本形式的數(shù)據(jù)交換格式,比 xml 更為輕量。Json 的解析和生成的方式很多,在 Android...
    業(yè)志陳閱讀 79,476評(píng)論 9 69
  • 概況 Gson是一個(gè)Java庫(kù),它可以用來把Java對(duì)象轉(zhuǎn)換為JSON表達(dá)式,也可以反過來把JSON字符串轉(zhuǎn)換成與...
    木豚閱讀 6,999評(píng)論 0 2

友情鏈接更多精彩內(nèi)容