@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
public @interface SerializedName {
String value();
String[] alternate() default {};
}
SerializedName
注解是运行时注解,可以标注类属性和类方法。 必须传入一个double
类型的值。
SerializedName
可以传入两个参数:
value
参数是默认可选值,字符串类型。
alternate
参数是其他可选值,字符串数组类型,它有默认值,默认值是空数组。
SerializedName
注解是用来映射实体类的字段与JSON中的key
的。
通常,实体类的字段与JSON中的key
是相同的, 但是,有时候可能会有意外,毕竟,不同的语言对变量的命名风格有着不同的习惯,比如, 在Java里,通常采用驼峰命名法, 而PHP喜欢用下划线,这时候,可能我们希望保持自己的风格,所以,就不得不做个映射。
还有的时候是一些单词的组合比较随意,比如:downloadURL
、download_url
、downloadUrl
这几种情况都有可能出现, 这时候就需要使用此注解了。
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
里的downloadURL
、downloadUrl
、download_url
、downloadurl
都可以被映射为Java
里的downloadURL
。