Gson
是Google
提供的一个Java
库,用于将Java
对象转换为JSON
字符串,或将JSON
字符串转换为Java
对象。它可以通过注解来定制序列化和反序列化过程,以满足特定的需求。
@SerializedName
该注解用于指定JSON字段的名称。
默认情况下,Gson将使用Java对象属性名作为JSON字段名,如果Java对象的属性名称和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
}
在这个例子中,我们通过注解将User对象中name属性与JSON中的"name","user_name","userName"字段建立了映射关系。
- 在反序列化的过程中,上述三个JSON字段都会转换为对象中的name属性。
- 反序列化的时候如果出现多个字段映射为同一个属性,数据中后出现的字段会覆盖前面出现的字段,可以理解为按顺序解析后被覆盖了。
- 序列化的时候name属性会转换为JSON中的name字段,以注解中value对应的值为准。
@Expose
该注解用于控制对象属性的序列化和反序列化。
默认情况下,所有的属性都会被序列化和反序列化。但是,如果我们希望对某些属性进行控制,可以使用该注解来指定。
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
}
在这个例子中,我使用了不同的参数的组合来为属性添加@Expose注解。
- @Expose 包含两个属性:serialize、deserialize,这两个属性的默认值均为 true。
- serialize 用于确定该属性是否可序列化。当 serialize 值为 false 时,序列化过程会忽略该属性。
- deserialize 用于确定该属性是否可反序列化。当 deserialize 值为 false 时,反序列化过程会忽略该属性。
- @Expose相当于@Expose(serialize = true, deserialize = true),即可序列化也可反序列化。
- 没有@Expose注解的属性不会被序列化或反序列化,就像是@Expose(serialize = false, deserialize = false)一样。
要让@Expose能够正常发挥作用还需要配合Gson的设置
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":""}
}
}
- 在进行序列化和反序列化时所使用的Gson对象需要用excludeFieldsWithoutExposeAnnotation()方法进行设置。
- 普通的Gson对象会忽略@Expose注解
网友评论