【问题标题】:Unable to parse JSON with GSON in Scala无法在 Scala 中使用 GSON 解析 JSON
【发布时间】:2016-09-23 01:39:42
【问题描述】:

我正在使用Gson将json解析为Scala,但出现错误,代码如下,看起来是Gson.fromJson(String, java.lang.reflect.Type type)

object GsonUtils {
  val GSON = new GsonBuilder().create()

  def java2Json(obj: Object) = GSON.toJson(obj)

  def json2Java[T](json: String, tyze: Type) = GSON.fromJson(json, tyze)
}

case class Data(@BeanProperty val name: String, @BeanProperty val age: Int)

object GsonUtilsTest {
  def main(args: Array[String]) {
      val d = Data("1",1)
       val json = GsonUtils.java2Json(d)
      println(json)

    //ERROR
    val d2 = GsonUtils.json2Java(json, classOf[Data]).asInstanceOf[Data]

    val dats = new java.util.ArrayList[Data]()
    dats.add(Data("1",1))

    val json2 = GsonUtils.java2Json(dats)


    val tyze = new TypeToken[ java.util.List[Data]](){

    }.getType()

    //ERROR
    GsonUtils.json2Java(json2,tyze)

  }
}

当我运行它时,抛出异常,异常是:

Exception in thread "main" java.lang.ClassCastException: com.xyz.Data incompatible with scala.runtime.Nothing$
    at java.lang.ClassCastException.<init>(ClassCastException.java:58)
    at com.xyz.GsonUtils$.json2Java(GsonUtils.scala:18)
    at com.xyz.GsonUtilsTest$.main(GsonUtils.scala:30)
    at com.xyz.GsonUtilsTest.main(GsonUtils.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:88)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:613)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

【问题讨论】:

    标签: scala gson


    【解决方案1】:

    使用 fromJson(String json, Class classOfT) 而不是 fromJson(String json, Type typeOfT)

    object GsonUtils {
      val GSON = new GsonBuilder().create()
    
      def java2Json(obj: Object) = GSON.toJson(obj)
    
      //def json2Java[T](json: String, tyze: Type) = GSON.fromJson(json, tyze)
    
      def json2Java[T](json: String, tyze: Class[T]) = GSON.fromJson(json, tyze)
    }
    
    case class Data(val name: String, val age: Int)
    
    object GsonUtilsTest {
      def main(args: Array[String]) {
        val d = Data("1",1)
        val json = GsonUtils.java2Json(d)
        println(json)
    
        val obj:Data = GsonUtils.json2Java(json, classOf[Data])
        println(s"${obj}")
    
    
        val d2:util.ArrayList[Data] = new util.ArrayList[Data]
        d2.add(Data("1",1))
        d2.add(Data("2",2))
    
        val json2 = GsonUtils.java2Json(d2)
        println(json2)
    
        val dataclass = classOf[util.ArrayList[Data]]
    
        val obj2:util.ArrayList[Data] = GsonUtils.json2Java(json2, dataclass)
    
        println(s"${obj2}")
      }
    }
    

    【讨论】:

    • 感谢@yaocl,我能够解决使用 Type 的问题。
    猜你喜欢
    • 2021-08-23
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多