【问题标题】:using jerkson in scala for list of lists在 scala 中使用 jerkson 获取列表列表
【发布时间】:2013-03-29 22:04:00
【问题描述】:

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

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

【问题讨论】:

    标签: json scala jerkson


    【解决方案1】:

    一个警告:原来的 Codahale Jerkson 一直是 abandoned 并且没有正式的 Scala 2.10 版本(尽管有 some Github forks 2.10)。另一方面,jackson-module-scala(由jerkson 包装)得到全面维护和支持。

    [EDIT] 澄清问题后。

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

    解决它的一种方法是使用集合转换器转换为 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]])
    

    【讨论】:

    • 对不起,我的意思是:我希望能够将 json_ver 转换回与 orig 匹配的结构,换句话说,是一个包含多个嵌套列表的列表。这里的 parse 命令似乎并没有转换 json_ver 中的所有 json 对象。
    • 原始数据结构不是列表的列表。它是List[Object],因为其中既有字符串(“this”),也有列表。 parse 方法返回的是List[Any]。除了这个差异之外,我在两者中都看到了相同的元素。
    • 好的,所以我不应该指望解析会生成这个 List(this,List(a,b,List(c,d))?也许我误解了这里的解析是如何工作的
    • 非常感谢您的帮助。我似乎没有关注何时使用此转换。你介意用上面提供的例子发布一个sn-p代码吗?那太棒了!
    • 我认为最好考虑一下您要完成的工作的用例。我用将 ArrayList 转换为 Scala 列表的示例更新了答案。一般来说,听起来你真正想要的是一些类或案例类来包装你的数据结构,而不是仅仅使用列表。
    猜你喜欢
    • 2011-09-15
    • 2015-01-19
    • 2019-03-10
    • 2010-12-01
    • 1970-01-01
    • 2014-07-31
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多