Gson常用注解的使用示例

2023-05-22  本文已影响0人  _青_9609

GsonGoogle提供的一个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注解
上一篇 下一篇

猜你喜欢

热点阅读