自学内容网 自学内容网

【scala】scala枚举类最佳实现及其jackson序列化方式

参考文章:

官网参考:
jackson是支持scala内部的Enumeration的,但是jackson版本需要新一些,比如2.14后。
jackson github
jackson-module-scala github
enumeratum github

scala各个枚举类方式对比:
最好的就是:
scala2: sealed trait/abstract class + case object,并继承第三方enumeratum方式,其中enumeratum作用就是使用了内部findValues方法便于获取所有单例。
scala3: 内置的enum实现,暂时不晓得咋用
Using Enumerations in Scala Best Practices
Scala Enumerations

springboot默认使用jackson,需要配置jackson moulde的实现
Spring Boot集成Scala

上代码:

import com.fasterxml.jackson.annotation.{JsonTypeInfo}
import enumeratum._
import net.minidev.json.annotate.JsonIgnore

// 最好所有field都配置上@JsonIgnore
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@clazz")
sealed abstract class Direction(@JsonIgnore index: Int, @JsonIgnore name: String) extends EnumEntry
object Direction extends Enum[Direction] {
  val values = findValues

  case object From extends Direction(0, "from")
  case object To extends Direction(1, "to")
}

测试:

import com.fasterxml.jackson.core.`type`.TypeReference
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.databind.{DeserializationFeature, ObjectMapper}
import com.fasterxml.jackson.module.scala.{ClassTagExtensions, DefaultScalaModule, JsonScalaEnumeration, ScalaObjectMapper}
import enumeratum._
import org.scalatest.FunSuite

case class SealedDemo(name: String, direction: Direction)

class JacksonTest extends FunSuite {
  def getMapper() = {
    val jackson = JsonMapper.builder()
      .addModule(DefaultScalaModule)
      .build() :: ClassTagExtensions
    jackson.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    jackson
  }
  
  test("sealed-seri-deseri") {
    val mapper = getMapper()
    val obj01 = SealedDemo("test", Direction.To)
    val str01 = mapper.writeValueAsString(obj01)
    // {"name":"test","direction":{"@clazz":"xxx.utils.Direction$To$"}}
    println(str01)

    val obj02=mapper.readValue(str01,classOf[SealedDemo])
    println(obj02)
    // SealedDemo(test,To)
  }
}

原文地址:https://blog.csdn.net/lisacumt/article/details/136215426

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!