Guest User

Untitled

a guest
Feb 18th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.07 KB | None | 0 0
  1. import com.fasterxml.jackson.core.JsonParser
  2. import com.fasterxml.jackson.databind.DeserializationContext
  3. import com.fasterxml.jackson.databind.JsonDeserializer
  4.  
  5. import scala.reflect.runtime.universe._
  6.  
  7. class ScalaEnumDeserializer[T](implicit tag: TypeTag[T]) extends JsonDeserializer[T] {
  8.  
  9. private[this] val values: Map[String, T] = {
  10. val knownSubclasses = tag.tpe.typeSymbol.asClass.knownDirectSubclasses.filter(_.isModuleClass)
  11.  
  12. //sealed trait and have subclasses-objects - an enum!
  13. knownSubclasses.map { e =>
  14. val v = runtimeMirror(getClass.getClassLoader).reflectModule(e.asClass.module.asModule).instance.asInstanceOf[T]
  15. v.toString -> v
  16. }.toMap
  17. }
  18.  
  19. private[this] val name = tag.tpe.typeSymbol.name.toString.trim
  20.  
  21. override def deserialize(p: JsonParser, ctxt: DeserializationContext): T = {
  22. val v = p.getText()
  23. values.get(v) match {
  24. case Some(r) => r
  25. case None => throw new RuntimeException(s"Unknown value '${v}' for enum ${name}. Valid values are: " +
  26. values.keys.toList.sorted.map("'" + _ + "'").mkString(", "))
  27. }
  28. }
  29.  
  30. }
Add Comment
Please, Sign In to add comment