@SerializedName
1.1、SerializedName注解的定义
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SerializedName {
    String value();

    String[] alternate() default {};
}

SerializedName注解是运行时注解,可以标注类属性和类方法。 必须传入一个double类型的值。

SerializedName可以传入两个参数:

value参数是默认可选值,字符串类型。

alternate参数是其他可选值,字符串数组类型,它有默认值,默认值是空数组。

1.2、SerializedName注解的作用

SerializedName注解是用来映射实体类的字段与JSON中的key的。

通常,实体类的字段与JSON中的key是相同的, 但是,有时候可能会有意外,毕竟,不同的语言对变量的命名风格有着不同的习惯,比如, 在Java里,通常采用驼峰命名法, 而PHP喜欢用下划线,这时候,可能我们希望保持自己的风格,所以,就不得不做个映射。

还有的时候是一些单词的组合比较随意,比如:downloadURLdownload_urldownloadUrl这几种情况都有可能出现, 这时候就需要使用此注解了。

1.3、示例

1、创建一个实体类:

package com.fpliu.xx

import com.google.gson.annotations.SerializedName

data class Font(
    val id: Int,
    val name: String = "",
    @SerializedName("downloadURL", alternate = ["download_url", "downloadUrl", "downloadurl"])
    val downloadURL: String = ""
)

该实体类被SerializedName注解,我们传入的第一个参数是downloadURL, 他是优先被使用的,如果发现JSON里没有此字段,就依次选择alternate参数中的字段。

2、使用:

val json = """{"id":10, "name":"阿里巴巴普惠体", "downloadUrl":"http://www.taobao.com"}"""
val font = Gson().fromJson(json, Font::class.java)

JSON里的downloadURLdownloadUrldownload_urldownloadurl都可以被映射为Java里的downloadURL