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() } }
关键优化点
- 复用Gson实例:避免每次转换都创建新的Gson对象,减少不必要的内存开销
- 参数改为可空类型:Room在处理空字段时可能传入
null或空字符串,可空参数能覆盖这种场景 - 双重空安全判断:既处理输入字符串为空的情况,也处理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
相关产品推荐
相关产品推荐

