Android解析json串的时候由于没有字段从而报错


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))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值