如何确定类的类型并将其从Json方法括号传递给gson

时间:2018-10-03 22:28:15

标签: java generics kotlin gson

我正在尝试创建一种解析机制的机制,该机制位于相同的密封类中,并且基于某种类型的确定,以便能够将字符串解析为该特定类。

这是示例设置:

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 :(得分:0)

您可以使用修改后的通用参数(Kotlin documentation)。

然后可以像普通类一样使用type参数:

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)