2016-08-22 74 views
0

我目前的HashMap是這樣的:如何將嵌套的hasashps嵌套HashMap轉換爲Scala中的json?

val h1 = HashMap[String,Object]() 
val h2 = ListBuffer[HashMap[String,String]]() 
val h3 = HashMap[String,Object]() 
val h4 = ListBuffer[HashMap[String,String]]() 

基本上H1是我的主要哈希,用鑰匙H2和H3和其他字符串。 h3有鍵到h4和其他字符串。

因爲Scala不支持哈希與字符串>對象類型的JSON,我已經看到了我寫我的舊的讀/寫方法

我怎麼能寫的寫入和讀取方法,使得檢測內部地圖,列表?在播放搭售時

play.api.UnexpectedException: Unexpected exception[RuntimeException: java.lang.VerifyError: class com.fasterxml.jackson.module.scala.ser.ScalaIteratorSerializer overrides final method withResolved.(Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/std/AsArraySerializerBase;] 
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:276) 
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206) 
at play.api.GlobalSettings$class.onError(GlobalSettings.scala:160) 
at play.api.DefaultGlobal$.onError(GlobalSettings.scala:188) 
at play.api.http.GlobalSettingsHttpErrorHandler.onServerError(HttpErrorHandler.scala:98) 
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100) 
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99) 
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344) 
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343) 
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32) 

Caused by: java.lang.RuntimeException: java.lang.VerifyError: class com.fasterxml.jackson.module.scala.ser.ScalaIteratorSerializer overrides final method withResolved.(Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/std/AsArraySerializerBase; 
at play.api.mvc.ActionBuilder$$anon$2.apply(Action.scala:463) 
at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112) 
at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5$$anonfun$apply$6.apply(Action.scala:112) 
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:111) 
at play.api.mvc.Action$$anonfun$apply$2$$anonfun$apply$5.apply(Action.scala:110) 
at scala.Option.map(Option.scala:146) 
at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:110) 
at play.api.mvc.Action$$anonfun$apply$2.apply(Action.scala:103) 
at scala.concurrent.Future$$anonfun$flatMap$1.apply(Future.scala:251) 

Caused by: java.lang.VerifyError: class com.fasterxml.jackson.module.scala.ser.ScalaIteratorSerializer overrides final method withResolved.(Lcom/fasterxml/jackson/databind/BeanProperty;Lcom/fasterxml/jackson/databind/jsontype/TypeSerializer;Lcom/fasterxml/jackson/databind/JsonSerializer;)Lcom/fasterxml/jackson/databind/ser/std/AsArraySerializerBase; 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 

我的依賴Scala to JSON in Play Framework 2.1

從迪馬的使用傑克遜,得到錯誤的建議:

libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.4.4" 
libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.5.1" 

回答

1

我一直在關注這個至今誰告訴你scala不支持它? 有各種不同的庫...例如,如果你使用傑克遜,你需要做的僅僅是這樣的:在傑克遜建議

val mapper = new ObjectMapper() 
    .registerModule(DefaultScalaModule) 

val h1 = mapper.readObject(input, classOf[Map[String,_]]) 
+0

謝謝,它工作時,我有它本身隔離,但是當我將其重新插入到我的播放項目中時,我遇到了錯誤,你知道爲什麼嗎? – chonglawr

+0

@我在猜測,那是因爲你在同一個應用程序中使用了不同版本的Jackson。比如,爲什麼Jackson核心和Scala模塊有不同的版本? – Dima

+0

是的,這是問題,我更新他們都有相同的版本和修復。 – chonglawr