scala - 有没有办法阻止 Scala 2.12 破坏 Jackson 对象映射器?

标签 scala jackson

我正在将我的 Scala 版本从 2.11 升级到 2.12,对象映射器似乎损坏了。我的代码的其他部分需要仅在 2.12 下可用的功能。

using scala 2.12 with spark 2.1提到重建 jackson 作为一种可能的解决方案。这真的有必要还是有更简单的解决方案?

Scala 2.11.0 的 SBT 配置

// Identity
name := "ScalaJsonSpike00"
organization := "com.acme"

// Versions
version := "1.0"
scalaVersion := "2.11.0"

// Scala test
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test"

// JSON
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.8"
// https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-scala_2.11
libraryDependencies += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.8.8"

2.11 和 2.12 的代码

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper

object Main {
  def main(args: Array[String]): Unit = {

    val originalMap = Map("a" -> List(1,2), "b" -> List(3,4,5), "c" -> List())
    val mapper = new ObjectMapper() with ScalaObjectMapper
    mapper.registerModule(DefaultScalaModule)
    println(mapper.writeValueAsString(originalMap))
  }
}

Scala 2.11.0 的结果

{"a":[1,2],"b":[3,4,5],"c":[]}

SBT 配置更新到 scala 2.12.1

scalaVersion := "2.12.1"

Scala 2.12.1 的结果

com.intellij.rt.execution.application.AppMain Main
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper.$init$(Lcom/fasterxml/jackson/module/scala/experimental/ScalaObjectMapper;)V
    at Main$$anon$1.<init>(Main.scala:9)
    at Main$.main(Main.scala:9)
    at Main.main(Main.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

最佳答案

您应该使用 %% 获取 jackson-module-scala:适合您的 Scala 版本:

libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.8.8"

在您当前的版本中,您始终使用此模块的 Scala 2.11 版本,它与 Scala 2.12 二进制不兼容。

核心 Jackson 库没有像 Java 库那样的问题,因此不受 Scala 版本的任何影响。

关于scala - 有没有办法阻止 Scala 2.12 破坏 Jackson 对象映射器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43568116/

相关文章:

java - 在 Scala 中使用 java 迭代器

java - 无法与 jackson 合作

java - 自定义 Jackson 映射器来处理单个字段的映射?

java - 使用 Jackson 处理 json 反序列化中缺失的类

class - 在 Scala 2.9 之后,case 类的哪些内容将被删除?

scala - Spray.io、光滑、sqlite3 : no suitable driver found

json - Jackson 在@ManyToMany 关系中序列化问题

java - 如何在解析 JSON 时找到父 Json 节点

scala - 使用Scala在Apache Spark中连接不同RDD的数据集

scala - 如何从证书链、证书和私钥正确配置 HTTPS?阿卡 HTTP