@JsonAdapter
1.1、JsonAdapter注解的定义
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface JsonAdapter {
    Class<?> value();

    boolean nullSafe() default true;
}

JsonAdapter注解是运行时注解,可以标注类属性和类。

1.2、JsonAdapter注解的作用

不使用JsonAdapter注解的时候,TypeAdapter必须用如下的方法进行注册:

GsonBuilder().registerTypeAdapter(Type type, Object typeAdapter)

使用JsonAdapter注解就相当于自动执行了上面的注册方法,因而开发者就不用再调用上面的方法进行注册了。

JsonAdapter注解是为了简化注册TypeAdapter的过程。

1.3、示例

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)