You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中Json数组为空时如何处理Type Converter?

解决Room Type Converter解析空JSON数组时的空指针异常

问题根源

你的代码中,当数据库存储的JSON字符串为空(或对应空数组场景)时,Gson的fromJson方法会返回null,直接调用toList()就会触发空指针异常——因为Kotlin不允许对null对象调用方法。

修复方案

修改Type Converter的解析逻辑,同时处理输入字符串为空和解析结果为null的情况,返回空列表替代null,具体代码如下:

class TotalCaseConverters {
    // 复用Gson实例,避免重复创建提升性能
    private val gson = Gson()

    @TypeConverter
    fun listToJsonString(value: MutableList<Tech>?): String = gson.toJson(value)

    @TypeConverter
    fun jsonStringToList(value: String?): List<Tech> {
        // 先判断输入是否为空,直接返回空列表
        if (value.isNullOrEmpty()) {
            return emptyList()
        }
        // 解析后若返回null,同样返回空列表
        return gson.fromJson(value, Array<Tech>::class.java)?.toList() ?: emptyList()
    }
}

关键优化点

  1. 复用Gson实例:避免每次转换都创建新的Gson对象,减少不必要的内存开销
  2. 参数改为可空类型:Room在处理空字段时可能传入null或空字符串,可空参数能覆盖这种场景
  3. 双重空安全判断:既处理输入字符串为空的情况,也处理Gson解析返回null的情况,确保始终返回非空的List<Tech>

可选方案:直接解析为List

如果你更倾向于直接解析成List而非Array,可以使用TypeToken指定泛型类型,代码如下:

@TypeConverter
fun jsonStringToList(value: String?): List<Tech> {
    if (value.isNullOrEmpty()) {
        return emptyList()
    }
    val listType = object : TypeToken<List<Tech>>() {}.type
    return gson.fromJson(value, listType) ?: emptyList()
}

额外注意事项

  • 确保Tech类拥有无参构造函数,或者配置Gson支持带参数的构造函数(比如使用@SerializedName注解),否则Gson解析会失败
  • 如果数据库中存储的是空字符串而非标准的空数组"[]",上述代码也能正常处理

内容的提问来源于stack exchange,提问作者Mahendran Candy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:07:20