【问题标题】:How to let json4s or other scala json libs generate Java Collections如何让 json4s 或其他 scala json 库生成 Java 集合
【发布时间】:2018-03-28 14:40:19
【问题描述】:

背景:

  1. 我使用了一些需要 Java 集合的 Java 库(java.util.ArrayList 等)
  2. 输入的JSON项目是动态的,所以我只能使用Map[String, Any]作为json4s的提取方法的结果类型(即parse(json).extract[Map[String, Any]]

例外:

我从 Java 库中得到了一个例外,说 java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to java.util.ArrayList

原因:

我猜这是因为 Json4s 只生成 scala List 而 Java List 用于 JArray 元素(例如 ["a", "b", "c"] => scala.collection.immutable.List("a", "b", "c")

那么,问题是我该如何处理这个案子?

【问题讨论】:

    标签: java json scala json4s


    【解决方案1】:

    您应该坚持使用 json4s 的 scala 类型(通常适用于所有 scala 代码)。然后就可以使用scala.collection.JavaConverters按照如下方式转换scala对象了。

    val list = List(1,2,3)
    val javaList: java.util.List[Int] = list.asJava
    
    yourJavaLib.call(javaList)
    

    如果你真的需要一个 ArrayList(而不仅仅是一个 java.util.List),我会按照以下方式创建它。

    val arrayList = new ArrayList(javaList)
    

    【讨论】:

    • 根据后台,我不知道Map values 的类型。那么我应该循环整个Map 并将所有 scala 列表转换为 java 列表吗?
    【解决方案2】:

    目前,我为这个案子找到了一个丑陋但有效的方法。

    mapper = new com.fasterxml.jackson.databind.ObjectMapper mapper.readValue(org.json4s.jackson.Serialization.write(scalaMap), new TypeReference[java.util.Map[String, Object]](){})

    【讨论】:

      猜你喜欢
      • 2013-12-12
      • 2013-07-06
      • 2016-12-31
      • 2012-07-19
      • 2012-06-14
      • 2017-01-05
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多