2013-04-07 44 views
0

我有以下,並希望在斯卡拉使用jerkson,但我有這個問題。我確信這是一個非常業餘的錯誤,但希望能從這裏得到一些幫助。在斯卡拉使用jerkson列表清單

scala> val orig=List("this", List("a", "b", List("c", "d"))) 
    orig: List[java.lang.Object] = List(this, List(a, b, List(c, d))) 

val json_ver=generate(orig) 
json_ver: String = ["this",["a","b",["c","d"]]] 

//now i want to go from json_ver back to orig list of lists 
//I've tried parse[List[Any]](json_ver) 
//parse[List[List[Any]]](json_ver) 

所有無濟於事。我真的很感激,如果有人可以點我在正確的方向

回答

2

一句警告:原來Codahale Jerkson一直abandoned而且也沒有正式建立斯卡拉2.10(雖然有some Github的叉子2.10)。另一方面,jackson-module-scala(其中jerkson包裝)得到充分維護和支持。

[編輯]在澄清問題後。

原始數據結構是使用List S的AnyList S和String S)。從解析器返回的是List,但其中的列表是java.util.ArrayList。這種類型也是一個列表,但不是相同的,並且不適合原生Scala集合。除此之外,它具有toString的不同實現,這就是輸出不同的原因。請注意,它仍然是一個列表Any,而不是Scala List s。

一種方式來解決這將是隻使用採集轉換器轉換爲斯卡拉:

import scala.collection.JavaConverters._ 
// somewhere down the line 
val parsedList = parse[List[Any]](json_ver) 

parsedList.foreach { 
    case s: String => println("string: " + s) 
    case l: util.ArrayList[Any] => doSomething(l.asScala.toList) 
} 

... 
def doSomething(lst: List[Any]) { 
    println(lst) 
} 

另一種方式是,如果你使用傑克遜,你可以將其配置爲使用Java數組:

val mapper = new ObjectMapper() 
mapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true) 
mapper.registerModule(DefaultScalaModule) 
mapper.readValue[List[Any]](json_ver, classOf[List[Any]]) 
+0

對不起,我的意思是:我想能夠將json_ver轉換回與orig匹配的結構,換句話說就是具有多個嵌套列表的列表。這裏的parse命令似乎並不轉換json_ver中的所有json對象。 – JPC 2013-04-08 00:11:12

+0

原始數據結構不是列表的列表。它是'List [Object]',因爲它裏面都有字符串(「this」)和列表。解析方法返回的是'List [Any]'。除了這個區別之外,我在兩個方面看到了相同的元素。 – 2013-04-08 00:19:42

+0

好的,所以我不應該指望解析使這個列表(這,列表(a,b,列表(c,d))?也許我誤解了如何解析這裏工作 – JPC 2013-04-08 00:50:45