Scala десериализовать класс динамически с помощью Gson - PullRequest
0 голосов
/ 24 октября 2018

Я работаю на языке программирования 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 голосов
/ 24 октября 2018

Допустим, у вас есть три класса дел

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)
...