Как определить тип класса и передать его в gson из скобок метода Json - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь создать механизм синтаксического анализа объектов, которые находятся в одном и том же запечатанном классе и основаны на каком-то определении типа, чтобы можно было проанализировать строку для этого конкретного класса.

Так вот примерsetup:

1) запечатанный класс:

  sealed class Animal
data class Dog(
var name: String
): Animal()

data class Cat(
var color: String
): Animal()

2) метод синтаксического анализа, который анализирует JSON для этого конкретного класса

  fun parse(json: String, model: KClass<out Animal>) {
  //so how to pass the type of the "model" parameter to this brackets instead of question mark?
  val animal = gson.fromJson<?>(json, object : TypeToken<?>() {}.type) 
  //and then do something

}

Так что я думаю, что смогу использовать это, например:

json = "" //some json
parse(json, Cat::class)

Как этого добиться?

Единственный способ найти сейчас - это что-то вроде этого:

fun parse(json: String, model: KClass<out Animal>) {
  when (model) {
  Cat::class -> {
    val cat = gson.fromJson<Cat>(json, object : TypeToken<Cat>() {}.type)
    //and then do something
  }
  Dog::class -> {
    val dog = gson.fromJson<Dog>(json, object : TypeToken<Dog>() {}.type)
    //and then do something
  }
 }
}

Но есть ли лучший способ?

1 Ответ

0 голосов
/ 04 октября 2018

Вы можете использовать универсальный параметр reified ( Документация Kotlin ).

Параметр типа может затем использоваться как обычный класс:

inline fun <reified T> parse(json: String) {
    val animal = gson.fromJson<T>(json, object : TypeToken<T>() {}.type)

    //do somehing with the result
    when(animal) {
        is Dog -> ...
        is Cat -> ...
    }        
}

//Call parse function
parse<Cat>(json)
...