0

我有以下内容,并想在 scala 中使用 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)

一切都无济于事。如果有人能指出我正确的方向,我将不胜感激

4

1 回答 1

2

一个警告:原来的 CodahaleJerkson已经被放弃了,并且没有为 Scala 2.10 正式构建(尽管有一些Github fork 2.10)。另一方面,jackson-module-scala(包装)得到充分维护和支持。jerkson

[编辑]澄清问题后。

原来的数据结构是使用Lists of Any( Lists and Strings)。从解析器返回的是List,但其中的列表是java.util.ArrayList。该类型也是一个列表,但不一样,并且不适合原生的 Scala 集合。除其他外,它具有不同的实现toString,这就是输出不同的原因。请注意,它仍然是 Scala 的列表Any,而不是 ScalaList的列表。

解决它的一种方法是使用集合转换器转换为 Scala:

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)
}

另一种方法是,如果您要使用 Jackson,您可以将其配置为使用 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]])
于 2013-04-08T00:01:46.307 回答