Передайте DataType класса - PullRequest
       31

Передайте DataType класса

1 голос
/ 07 ноября 2019

У меня есть следующий класс данных, в котором хранятся два значения, 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 .

Теперь я хотел бы перебрать каждый элемент 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?

Кроме того, если этосписок, мне нужно вызвать toList () для Gson (). fromJSON (..):

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 и различать, является ли он списком / массивом или классом с прямым доступом? Кроме того, всякий раз, когда я пытаюсь вызвать toList (), я получаю сообщение об ошибке, что оно не определено.

Если я указываю класс напрямую, тогда он работает нормально

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

или

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

, но мне нужно иметь возможность указать его динамически в качестве аргумента

1 Ответ

1 голос
/ 07 ноября 2019

Этот код работает нормально:

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)                                                              
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...