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
相关产品推荐
相关产品推荐

