传递类的数据类型

我有以下数据类,它存储两个值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",List<MyDataType>::class.java ) )

请注意,在一种情况下,我使用MyDataType作为数据类型,而在另一种情况下,我使用List

现在,我想遍历每个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 )
    }
}

如何动态传递数据类型并区分它是列表/数组还是直接类?另外,每当我尝试调用toList()时,都会收到一个错误消息,它是未定义的。

如果我直接指定该类,则可以正常工作

 var model = Gson().fromJson( json,Datatypeitem::class.java )

 var model = Gson().fromJson( json,Array<Datatypeitem>::class.java )

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

lcxs123 回答:传递类的数据类型

此代码可以正常工作:

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)                                                              
}  
本文链接:https://www.f2er.com/3145583.html

大家都在问