Джексон JSON десериализация Scala Option [AnyVal] - PullRequest
0 голосов
/ 29 июня 2019

Я хочу использовать Джексона для десериализации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...