2016-09-23 4 views
0

Gson을 사용하여 json을 스칼라로 파싱했지만 오류가 발생했습니다. 코드는 다음과 같습니다. Gson.fromJson (String, java.lang.reflect.Type type)스칼라에서 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 대신 fromJson의 (문자열 JSON 클래스 classOfT) (문자열 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

관련 문제