Я хочу использовать Джексона для десериализации JSON в классах случаев Scala, где есть несколько классов Option[_ <: AnyVal]
.
Я знаю, что есть много других сериализаторов, специально для Scala, но здесь требуется использовать Джексона.
Я нашел это, что я пытаюсьследовать: https://github.com/FasterXML/jackson-module-scala/wiki/FAQ
Следующее будет работать:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: Int) extends AnyVal
case class MyWrapper(@JsonDeserializer(contentAs = classOf[MyValue]) myInt: Option[MyValue])
val mapper = new ObjectMapper()
mapper.registerModule(new DefaultScalaModule)
mapper.readValue("{\"myInt\": 5}", classOf[MyWrapper])
Однако, если MyValue
обернуто String
, то произойдет сбой, если я не изменюcontentAs
to String
:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: String) extends AnyVal
case class MyWrapper(@JsonDeserializer(contentAs = classOf[String]) myInt: Option[MyValue])
Похоже, если MyValue
обернет примитивный тип, такой как int
, long
, ... тогда contentAs
должно быть MyValue
, иначе это должен быть тип, который является его оболочкой.В документации ничего не говорится об этом, это то, что я придумал во время игры.
Мой вопрос - какое здесь правило?Я даже делаю это правильно?
РЕДАКТИРОВАТЬ:
Я играл вокруг, и оказывается, что я не думаю, что вам нужно @JsonDeserializer
вообще - что противоречит совету вики ... может кто-нибудь пролить какой-нибудь свет?
Может показаться, что вам нужны только классы AnyVal
:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: Int) extends AnyVal
case class MyRefValue @JsonCreator() (@(JsonValue @getter) value: BigDecimal) extends AnyVal