You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala3下替换已废弃ScalaObjectMapper实现JSON序列化反序列化

Scala Jackson JSON工具类改造指南(解决ScalaObjectMapper废弃告警)

问题说明

原有基于ScalaObjectMapper实现的JSON序列化/反序列化工具类出现废弃告警:

ScalaObjectMapper is deprecated because Manifests are not supported in Scala3
官方指定替代方案为使用ClassTagExtensions,改造后可完全保留原有使用习惯,无需修改业务侧调用代码。


核心改造点

  • 导入替换:删除com.fasterxml.jackson.module.scala.ScalaObjectMapper导入,新增com.fasterxml.jackson.module.scala.ClassTagExtensions导入
  • Mapper定义修改:将new ObjectMapper() with ScalaObjectMapper改为new ObjectMapper() with ClassTagExtensions
  • 隐式参数替换:所有泛型方法的隐式参数从Manifest[T]替换为scala.reflect.ClassTag[T]
  • 序列化逻辑无需调整,和原有实现完全一致

改造后完整代码

import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.ClassTagExtensions
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import scala.reflect.ClassTag

object JsonUtil {
  val mapper = new ObjectMapper() with ClassTagExtensions
  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

  def toJson(value: Map[Symbol, Any]): String = {
    toJson(value map { case (k, v) => k.name -> v })
  }

  def toJson(value: Any): String = {
    mapper.writeValueAsString(value)
  }

  def toMap[V](json: String)(implicit m: ClassTag[V]): Map[String, V] = fromJson[Map[String, V]](json)

  def fromJson[T](json: String)(implicit m: ClassTag[T]): T = {
    mapper.readValue[T](json)
  }
}

object MarshallableImplicits {

  implicit class Unmarshallable(unMarshallMe: String) {
    def toMap: Map[String,Any] = JsonUtil.toMap(unMarshallMe)
    def toMapOf[V]()(implicit m: ClassTag[V]): Map[String,V] = JsonUtil.toMap[V](unMarshallMe)
    def fromJson[T]()(implicit m: ClassTag[T]): T =  JsonUtil.fromJson[T](unMarshallMe)
  }

  implicit class Marshallable[T](marshallMe: T) {
    def toJson: String = JsonUtil.toJson(marshallMe)
  }
}

用法说明

原有业务侧调用代码完全不需要修改,和改造前使用方式一致:

反序列化用法

import com.some.package.json.JsonUtil.fromJson
import com.some.package.json.MarshallableImplicits._
def deserialize(json: String): MyCaseClass = fromJson[MyCaseClass](json)

序列化用法

import com.some.package.json.MarshallableImplicits._
def serialize(obj: MyCaseClass): String = obj.toJson

内容的提问来源于stack exchange,提问作者radumanolescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:45:09