@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface JsonAdapter {
Class<?> value();
boolean nullSafe() default true;
}
JsonAdapter
注解是运行时注解,可以标注类属性和类。
不使用JsonAdapter
注解的时候,TypeAdapter必须用如下的方法进行注册:
GsonBuilder().registerTypeAdapter(Type type, Object typeAdapter)
使用JsonAdapter
注解就相当于自动执行了上面的注册方法,因而开发者就不用再调用上面的方法进行注册了。
JsonAdapter
注解是为了简化注册TypeAdapter的过程。
1、创建一个实体类:
package com.fpliu.xx
data class Font(
val id: Int = 0,
val name: String = "",
val downloadURL: String = ""
)
2、创建一个TypeAdapter
:
package com.fpliu.xx
import com.google.gson.TypeAdapter
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonWriter
class FontTypeAdapter : TypeAdapter<Font>() {
override fun write(jsonWriter: JsonWriter, font: Font) {
jsonWriter.beginObject()
jsonWriter.name("id").value(font.id)
jsonWriter.name("name").value(font.name)
jsonWriter.name("downloadURL").value(font.downloadURL)
jsonWriter.endObject()
}
override fun read(jsonReader: JsonReader): Font {
var id = 0
var name = ""
var downloadURL = ""
jsonReader.beginObject()
while (jsonReader.hasNext()) {
when (jsonReader.nextName()) {
"id" -> id = jsonReader.nextInt()
"name" -> name = jsonReader.nextString()
"downloadUrl" -> downloadURL = jsonReader.nextString()
}
}
jsonReader.endObject()
return Font(id, name, downloadURL)
}
}
3、给实体类加上JsonAdapter
注解:
@JsonAdapter(FontTypeAdapter::class)
data class Font(
4、使用:
val json = """{"id":10, "name":"阿里巴巴普惠体", "downloadUrl":"http://www.taobao.com"}"""
val font = Gson().fromJson(json, Font::class.java)