首页 > 解决方案 > 传递类的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 )

但我需要能够将它动态指定为参数

标签: jsonkotlingsondeserialization

解决方案


此代码工作正常:

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) }                                                                                       

我重命名DataTypeItemMyDataTypeItem和。dataTypeItemMyDataType

为什么需要调用 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)                                                              
}  

推荐阅读