Я решил проблему определения пользовательских десериализаторов.
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.{DeserializationContext, JsonDeserializer}
class OperationsDeserializer extends JsonDeserializer[Operations] {
override def deserialize(p: JsonParser, ctxt: DeserializationContext): Operations = {
p.getValueAsString match {
case Foo.jsonValue => Foo
case Bar.jsonValue => Bar
case value => throw new IllegalArgumentException(s"Undefined deserializer for value: $value")
}
}
}
class RichOperationsDeserializer extends JsonDeserializer[Operations] {
override def deserialize(p: JsonParser, ctxt: DeserializationContext): Operations = {
p.getValueAsString match {
case Foo.jsonValue => Foo
case Bar.jsonValue => Bar
case Baz.jsonValue => Baz
case value => throw new IllegalArgumentException(s"Undefined deserializer for value: $value")
}
}
}
Более того, поскольку в сопоставлении / регистре требуются стабильные идентификаторы, я изменил jsonValue
с def
на val
: для этого, к сожалению, требуется объявление @JsonValue
аннотации в каждом перечислении объекта.
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
@JsonDeserialize(using = classOf[OperationsDeserializer])
sealed trait Operations { val jsonValue: String }
case object Foo extends Operations { @JsonValue override val jsonValue: String = "Foo" }
case object Bar extends Operations { @JsonValue override val jsonValue: String = "Bar" }
@JsonDeserialize(using = classOf[RichOperationsDeserializer])
sealed trait RichOperations extends Operations
case object Baz extends RichOperations { @JsonValue override val jsonValue: String = "Baz" }