【问题标题】:Scala deserialize class dynamically using GsonScala使用Gson动态反序列化类
【发布时间】:2018-10-23 23:46:59
【问题描述】:

我正在使用 Scala 编程语言工作

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

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

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

谢谢

【问题讨论】:

    标签: scala generics reflection gson deserialization


    【解决方案1】:

    假设你有三个案例类

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2015-05-06
      相关资源
      最近更新 更多