我接手了一个Android项目,需要将rxJava
代码转换为更加纯粹的Kotlin中心代码,并采用MVVM设计模式。虽然经验有限,我花费了很多时间和精力,最终完成了代码转换。但是,尽管测试进行得相当顺利,新的@TypeConverters
似乎更加严格,不允许存储Room数据库中期望对象的空列表。
当数据从服务器加载并且项目soil_types
为空,如soil_types=[]
时,我会收到错误消息:Expected receiver of type models.SoilType, but got java.util.ArrayList
.
以下是转换器的代码:
@TypeConverter
fun fromJson(json: String?): List<SoilType>? {
if(json == null) return null
return convertJsonToListObject(json)
}
@TypeConverter
fun toJson(objectData: List<SoilType>?): String? {
if (objectData == null) return null
return convertListObjectToJson(objectData)
}
//...
inline fun <reified T> convertJsonToListObject(json: String): List<T> =
moshi.adapter<List<T>>(T::class.java).fromJson(json).orEmpty()
inline fun <reified T> convertListObjectToJson(objectData: List<T>): String =
moshi.adapter<List<T>>(T::class.java).toJson(objectData)
以下是需要填充的房间模型:
@Entity(tableName = "soil")
data class Soil(
@PrimaryKey val id: Long,
val user_id: Long,
val name: String,
val soil_types: List<SoilType>,
val updated_at: String,
val created_at: String
)
我知道这不是一个好的数据表列设计和可能建立的关系。
我的问题是如何让转换器接受空ArrayList
,这样我就可以将emptyList
保存为类似'{}'的字符串
?或者,如果我不想这样做,应该允许null
吗?
编辑:
我尝试将转换器更改为以下内容:
@TypeConverter
fun fromJson(json: String?): List<SoilType> {
if(json == null || json == "{}") return emptyList()
return convertJsonToListObject(json)
}
@TypeConverter
fun toJson(objectData: List<SoilType>?): String {
if (objectData.isNullOrEmpty()) return "{}"
return convertListObjectToJson(objectData)
}
但错误仍然存在。
编辑2:
似乎我正在经历的是内置于 Moshi json库中的。在进一步阅读第
Moshi handling of null and absent JSON fields
部分后,看起来必须为数据类字段声明默认值才能获得预期结果:如果JSON响应更改并在JSON中设置空字段,则适配器将失败,尊重数据类中val属性的非null引用,并抛出明确的异常。
在这种情况下,是一个空的对象列表。
T::class.java
更改为Types.newParameterizedType(List::class.java, T::class.java)
时,它对我有效。你可以尝试一下吗? - user3738870