Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import com.fasterxml.jackson.core.JsonParser
- import com.fasterxml.jackson.databind.DeserializationContext
- import com.fasterxml.jackson.databind.JsonDeserializer
- import scala.reflect.runtime.universe._
- class ScalaEnumDeserializer[T](implicit tag: TypeTag[T]) extends JsonDeserializer[T] {
- private[this] val values: Map[String, T] = {
- val knownSubclasses = tag.tpe.typeSymbol.asClass.knownDirectSubclasses.filter(_.isModuleClass)
- //sealed trait and have subclasses-objects - an enum!
- knownSubclasses.map { e =>
- val v = runtimeMirror(getClass.getClassLoader).reflectModule(e.asClass.module.asModule).instance.asInstanceOf[T]
- v.toString -> v
- }.toMap
- }
- private[this] val name = tag.tpe.typeSymbol.name.toString.trim
- override def deserialize(p: JsonParser, ctxt: DeserializationContext): T = {
- val v = p.getText()
- values.get(v) match {
- case Some(r) => r
- case None => throw new RuntimeException(s"Unknown value '${v}' for enum ${name}. Valid values are: " +
- values.keys.toList.sorted.map("'" + _ + "'").mkString(", "))
- }
- }
- }
Add Comment
Please, Sign In to add comment