Scala使用Gson动态反序列化类

时间:2018-10-23 23:46:59

标签: scala generics reflection gson deserialization

我正在使用Scala编程语言

我想动态地将json反序列化为case类。所以我的v1代码是

  protected def DeSerializeJson(json: String): MyClass= {    
    val gson = new Gson
    val response = gson.fromJson(json, classOf[MyClass])
    response
  }

以上代码仅将json反序列化为MyClass。我想通过其他类型的参数使其可重用于其他类。这样我就可以传递不同的json和不同的类型,它将返回该特定的类对象。但是我无法弄清第二个参数的变量类型以及如何调用它。有人可以帮忙吗?

谢谢

1 个答案:

答案 0 :(得分:2)

假设您有三个案例类

case class MyClass(id:String)
case class MyClass2(name : String)
case class MyClass3(age : String)

现在,您可以编写带有附加参数T的自定义函数,该参数将类类型表示为

protected def DeSerializeJson[T](json: String,classType: T) = {
  val gson = new Gson

  classType match {
    case MyClass =>  gson.fromJson(json, classOf[MyClass])
    case MyClass2 => gson.fromJson(json, classOf[MyClass2])
    case MyClass3 => gson.fromJson(json, classOf[MyClass3])
  }
}

现在,基于我们在方法中作为参数传递的类类型,我们可以对其进行模式匹配以获得所需的结果。

通过使用具有不同参数的功能调用

DeSerializeJson("{ \"id\" : \"101\"}",MyClass)
DeSerializeJson("{ \"name\" : \"Tom\"}",MyClass2)
DeSerializeJson("{ \"age\" : \"12\"}",MyClass3)

我们得到一个输出

res0: Product with Serializable = MyClass(101)
res1: Product with Serializable = MyClass2(Tom)
res2: Product with Serializable = MyClass3(12)