参考文章:
官网参考:
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 = findValuescase 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.FunSuitecase class SealedDemo(name: String, direction: Direction)class JacksonTest extends FunSuite {def getMapper() = {val jackson = JsonMapper.builder().addModule(DefaultScalaModule).build() :: ClassTagExtensionsjackson.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)}
}