json - 传递类的DataType
问题描述
我有以下数据类,它存储两个值,JSON 和 dataType:
data class DataTypeItem(
var json : String = "",
var dataType : Class<*> ?= null
)
我有以下方式定义的列表:
val dataTypeList = mutableMapOf<String, DataTypeItem>()
dataTypeList.put( "item_1", DataTypeItem( json1, MyDataType::class.java ) )
dataTypeList.put( "item_2", DataTypeItem( json1, List<MyDataType>::class.java ) )
请注意,在一种情况下,我使用 MyDataType 作为 DataType,而在另一种情况下使用 List < MyDataType >。
现在我想遍历每个 dataTypeList 项并将给定数据类型的 JSON 解析到它的模型中:
fun init()
{
dataTypeList.forEach {
dataTypeItem ->
val model = Gson().fromJson( dataTypeItem.value.json, dataTypeItem.value.dataType::class.java )
}
}
我正在使用以下模型:
data class dataTypeItem(
@SerializedName("sqlId")
val sqlId: String,
@SerializedName("name")
val name: String
)
但我不断收到运行时异常:
Attempted to deserialize a java.lang.Class. Forgot to register a type adapter?
另外,如果它是一个列表,我需要在 Gson().fromJSON(..) 上调用 toList():
fun init()
{
dataTypeList.forEach {
dataTypeItem ->
val model;
if( dataTypeItem.value.dataType::class.java is Array )
model = Gson().fromJson( dataTypeItem.value.json, dataTypeItem.value.dataType::class.java ).toList()
else
model = Gson().fromJson( dataTypeItem.value.json, dataTypeItem.value.dataType::class.java )
}
}
如何动态传递 dataType 并区分它是 List/Array 还是直接类?此外,每当我尝试调用 toList() 时,都会收到一个未定义的错误。
如果我直接指定类,那么它工作正常
var model = Gson().fromJson( json, DataTypeItem::class.java )
或者
var model = Gson().fromJson( json, Array<DataTypeItem>::class.java )
但我需要能够将它动态指定为参数
解决方案
此代码工作正常:
val dataTypeMap = mapOf(
"item_1" to MyDataTypeItem("""{"sqlId" : "1", "name" : "a"}""", MyDataType::class.java),
"item_2" to MyDataTypeItem("""[{"sqlId" : "1", "name" : "a"}, {"sqlId" : "2", "name" : "b"}]""", Array<MyDataType>::class.java)
)
val result = dataTypeMap.map{ Gson().fromJson(it.value.json, it.value.dataType) }
我重命名DataTypeItem
为MyDataTypeItem
和。dataTypeItem
MyDataType
为什么需要调用 toList()?如果确实有必要,您可以执行以下操作:
val result = dataTypeMap.map {
if (it.value.dataType?.isArray == true) Gson().fromJson<Array<*>>(it.value.json, it.value.dataType).toList()
else Gson().fromJson(it.value.json, it.value.dataType)
}
推荐阅读
- mysql - 为什么我不能将变量传递给 MySQL 中的 VARCHAR(str_len)?
- javascript - 反应路由器不适用于现场生产
- async-await - 为什么在 Nuxt 中使用 Async with Axios 时不返回任何数据?
- django - 在 chrome 中面临奇怪的引导行为
- spring-boot - 如何使用 Spring Boot Camel 设置 Swagger 以进行 REST 消息传递
- php - 安装包时向 .env 添加新的环境变量
- nfc - 如何检查 NFC 安全元件位置
- django - 使用 django 过滤器时无法解析关键字
- python - 替换 isAlpha() 以包含下划线?
- if-statement - 不知道如何使用switch