2016-09-23 28 views
0

Gsonを使用してScalaにjsonを解析しましたが、エラーが発生しました。コードは次のとおりです。Gson.fromJson(String、java.lang.reflect.Type type)ScalaでGSONを使用してJSONを解析できません

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) 

答えて

0

使用fromJson(文字列のJSON、クラスclassOfT)の代わりに、fromJson(文字列JSON、タイプ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}") 
    } 
} 
+0

ありがとうございました@yaocl、私はTypeで動作する問題を解決することができます。 – Tom

関連する問題