将JSON字符串转为Scala case class时遇NoSuchMethodError求助
解决json4s转换JSON到Scala case class时的NoSuchMethodError问题
这个错误我之前也碰到过,九成是Scala版本和json4s依赖版本不兼容导致的!你代码里的implicit val formats写法其实没问题,问题出在依赖配置上。
错误原因解析
java.lang.NoSuchMethodError: scala.Function0.$init$(Lscala/Function0;)V这种错误,本质是因为json4s依赖编译时用的Scala版本,和你当前项目使用的Scala版本不匹配。Scala不同大版本(比如2.12、2.13)之间的字节码有差异,导致运行时找不到对应的方法。
具体解决方案
确认项目的Scala版本
打开IntelliJ的Project Structure(快捷键Ctrl+Alt+Shift+S),进入Modules→ 选中你的模块 → 切换到Scala标签,就能看到当前项目使用的Scala版本;或者直接看构建文件(比如build.sbt里的scalaVersion字段)。匹配对应的json4s依赖版本
json4s的版本和Scala版本有严格对应关系,以下是常用的匹配组合:- 如果用Scala 2.13:选择4.0.x及以上版本的json4s
- 如果用Scala 2.12:可以用3.6.x到4.0.x之间的版本
- 如果用Scala 2.11:选择3.5.x或更早的版本
举个
build.sbt依赖配置的例子:// Scala 2.13 示例 libraryDependencies ++= Seq( "org.json4s" %% "json4s-jackson" % "4.0.6", "org.json4s" %% "json4s-core" % "4.0.6" ) // Scala 2.12 示例 libraryDependencies ++= Seq( "org.json4s" %% "json4s-jackson" % "3.6.12", "org.json4s" %% "json4s-core" % "3.6.12" )注意:要保证json4s的所有模块(core、jackson等)版本完全一致,不要混合不同版本的依赖。
清理并重新构建项目
依赖更新后,先清理旧的编译文件:- 在IntelliJ中点击
Build → Clean Project,然后Build → Rebuild Project - 或者用sbt命令行执行:
clean compile
- 在IntelliJ中点击
简化代码写法(可选)
你的formats写法可以简化,只要提前导入org.json4s.DefaultFormats,就可以直接写:import org.json4s.DefaultFormats def jsonStrToMap(jsonStr: String) : EventPayloadIn = { implicit val formats = DefaultFormats parse(jsonStr).extract[EventPayloadIn] }这和你原来的写法效果一致,只是更简洁。
额外注意事项
- 如果是用Maven构建,要注意artifactId里的Scala版本后缀,比如
json4s-jackson_2.13对应Scala 2.13,不要写错。 - 检查项目中有没有其他依赖间接引入了不同版本的json4s,可以用
sbt dependencyTree(或Maven的dependency:tree)命令查看依赖树,排除冲突的版本。
内容的提问来源于stack exchange,提问作者Sankar
相关产品推荐
相关产品推荐

