GSON的各種使用方式

  • 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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末技羔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子卧抗,更是在濱河造成了極大的恐慌藤滥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社裆,死亡現(xiàn)場離奇詭異拙绊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門标沪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榄攀,“玉大人,你說我怎么就攤上這事金句¢萦” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵违寞,是天一觀的道長贞瞒。 經(jīng)常有香客問我,道長趁曼,這世上最難降的妖魔是什么军浆? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挡闰,結(jié)果婚禮上乒融,老公的妹妹穿的比我還像新娘。我一直安慰自己摄悯,他們只是感情好赞季,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奢驯,像睡著了一般申钩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叨橱,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機(jī)與錄音断盛,去河邊找鬼罗洗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钢猛,可吹牛的內(nèi)容都是我干的伙菜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼命迈,長吁一口氣:“原來是場噩夢啊……” “哼贩绕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起壶愤,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淑倾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后征椒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娇哆,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碍讨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治力。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勃黍,靈堂內(nèi)的尸體忽然破棺而出宵统,到底是詐尸還是另有隱情,我是刑警寧澤覆获,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布马澈,位于F島的核電站,受9級特大地震影響锻梳,放射性物質(zhì)發(fā)生泄漏箭券。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一疑枯、第九天 我趴在偏房一處隱蔽的房頂上張望辩块。 院中可真熱鬧,春花似錦荆永、人聲如沸废亭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆村。三九已至,卻和暖如春骂删,著一層夾襖步出監(jiān)牢的瞬間掌动,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工宁玫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粗恢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓欧瘪,卻偏偏與公主長得像眷射,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子佛掖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

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