Gson
是Google
提供的一個(gè)Java
庫,用于將Java
對(duì)象轉(zhuǎn)換為JSON
字符串岛琼,或?qū)?code>JSON字符串轉(zhuǎn)換為Java
對(duì)象视卢。它可以通過注解來定制序列化和反序列化過程雏逾,以滿足特定的需求嘉裤。
@SerializedName
該注解用于指定JSON字段的名稱。
默認(rèn)情況下栖博,Gson將使用Java對(duì)象屬性名作為JSON字段名屑宠,如果Java對(duì)象的屬性名稱和JSON字段的名稱不同,可以使用該注解來指定JSON字段名稱仇让。
import com.google.gson.annotations.SerializedName
class User {
@SerializedName(value = "name", alternate = ["user_name", "userName"])
var name: String = ""
@SerializedName("userAge")
var age: Int = 0
}
在這個(gè)例子中典奉,我們通過注解將User對(duì)象中name屬性與JSON中的"name","user_name","userName"字段建立了映射關(guān)系。
- 在反序列化的過程中丧叽,上述三個(gè)JSON字段都會(huì)轉(zhuǎn)換為對(duì)象中的name屬性卫玖。
- 反序列化的時(shí)候如果出現(xiàn)多個(gè)字段映射為同一個(gè)屬性,數(shù)據(jù)中后出現(xiàn)的字段會(huì)覆蓋前面出現(xiàn)的字段踊淳,可以理解為按順序解析后被覆蓋了假瞬。
- 序列化的時(shí)候name屬性會(huì)轉(zhuǎn)換為JSON中的name字段,以注解中value對(duì)應(yīng)的值為準(zhǔn)迂尝。
@Expose
該注解用于控制對(duì)象屬性的序列化和反序列化脱茉。
默認(rèn)情況下,所有的屬性都會(huì)被序列化和反序列化垄开。但是琴许,如果我們希望對(duì)某些屬性進(jìn)行控制,可以使用該注解來指定说榆。
import com.google.gson.annotations.Expose
class User {
@Expose
var name: String = ""
@Expose(serialize = true, deserialize = true)
var age1: Int = 0
@Expose(serialize = false)
var age2: Int = 0
@Expose(deserialize = false)
var age3: Int = 0
@Expose(serialize = false, deserialize = false)
var age4: Int = 0
var age5: Int = 0
}
在這個(gè)例子中,我使用了不同的參數(shù)的組合來為屬性添加@Expose注解寸认。
- @Expose 包含兩個(gè)屬性:serialize签财、deserialize,這兩個(gè)屬性的默認(rèn)值均為 true偏塞。
- serialize 用于確定該屬性是否可序列化唱蒸。當(dāng) serialize 值為 false 時(shí),序列化過程會(huì)忽略該屬性灸叼。
- deserialize 用于確定該屬性是否可反序列化神汹。當(dāng) deserialize 值為 false 時(shí),反序列化過程會(huì)忽略該屬性古今。
- @Expose相當(dāng)于@Expose(serialize = true, deserialize = true)屁魏,即可序列化也可反序列化。
- 沒有@Expose注解的屬性不會(huì)被序列化或反序列化捉腥,就像是@Expose(serialize = false, deserialize = false)一樣氓拼。
要讓@Expose能夠正常發(fā)揮作用還需要配合Gson的設(shè)置
import com.google.gson.Gson
import com.google.gson.GsonBuilder
class Example {
fun test() {
val data = User()
val gson: Gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()
val json: String = gson.toJson(data)
// {"age1":0,"age3":0,"name":""}
}
}
- 在進(jìn)行序列化和反序列化時(shí)所使用的Gson對(duì)象需要用excludeFieldsWithoutExposeAnnotation()方法進(jìn)行設(shè)置。
- 普通的Gson對(duì)象會(huì)忽略@Expose注解