data class DeviceBean(
var deviceId: Int = 0,
)
data class BasNetBean<T>(
val code: Int,
val message: String,
var data: T = DefaultStringProvider.provideDefault() as T
) {
fun isSuccess() = code == 0 || code == 200
}
data class DefaultStringProvider(private val defaultValue: String) : DefaultProvider<String> {
override fun provideDefault(): String {
return defaultValue
}
companion object {
fun provideDefault(): DefaultStringProvider {
return DefaultStringProvider("Default Value")
}
}
}
interface DefaultProvider<T> {
fun provideDefault(): T
}
class BasNetBeanDeserializer<T> : JsonDeserializer<BasNetBean<T>> {
override fun deserialize(
json: JsonElement,
typeOfT: Type,
context: JsonDeserializationContext
): BasNetBean<T> {
val jsonObject = json.asJsonObject
val code = jsonObject.get("code").asInt
val message = jsonObject.get("message").asString
// 获取 T 的具体类型
val dataType = object : TypeToken<T>() {}.type
// 将 JsonElement 转换为 T 类型
val data = jsonObject.get("data")?.let { context.deserialize<T>(it, dataType) }
// 检查 data 是否为 null,如果为 null,则使用默认值
val defaultData: T = data ?: DefaultStringProvider.provideDefault() as T
return BasNetBean(code, message, defaultData)
}
}
val json = """
{
"code": 200,
"message": "成功"
}
""".trimIndent()
val gsonBuilder = GsonBuilder()
gsonBuilder.registerTypeAdapter(BasNetBean::class.java, BasNetBeanDeserializer<Any>())
val gson = gsonBuilder.create()
val type = object : TypeToken<BasNetBean<DeviceBean>>() {}.type
val jsonObject = gson.fromJson<BasNetBean<DeviceBean>>(json, type)
logger.info("Success: $jsonObject")
信息: Success: BasNetBean(code=200, message=成功, data=DefaultStringProvider(defaultValue=Default Value))