У меня есть следующий Scala case class
:
case class InteractionPersona(
id: String,
geo: Option[(Option[String], Option[String], Option[String])])
Используя Джексона, когда я сериализую экземпляр класса:
val persona = InteractionPersona("123", Some((Some("canada"), None, None)))
val json = mapper.writeValueAsString(persona)
Я получаю следующий JSON:
{"id": "123", "geo": ["canada", null, null]}
что является совершенно правильным представлением для моих нужд. Однако во время десериализации я получаю com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of VALUE_NULL token
:
val actual = mapper.readValue(json, classOf[InteractionPersona])
По-видимому, null
не является приемлемым значением String
, но поскольку я десериализую в Scala Option[String]
, null
должно быть представлено как значение None
.
В Как десериализовать строку Jackson Json NULL до даты с JsonFormat, @wassgren предложил использовать конвертер с аннотацией JsonDeserialize
, и после прочтения документации я решил использовать вариант contentUsing
:
case class InteractionPersona(
id: String,
@JsonDeserialize(contentUsing = classOf[GeoConverter])
geo: Option[(Option[String], Option[String], Option[String])])
class GeoConverter extends JsonDeserializer[Option[(Option[String], Option[String], Option[String])]] {
override def deserialize(jp: JsonParser, ctxt: DeserializationContext): Option[(Option[String], Option[String], Option[String])] = {
throw new RuntimeException("tada")
}
}
К сожалению, этот код не вызывает ожидаемого исключения. Попытка использовать contentConverter
также не вызывает никаких исключений:
@JsonDeserialize(contentConverter = classOf[GeoConverter])
class GeoConverter extends StdConverter[String, Option[String]] {
override def convert(value: String): Option[String] = {
throw new RuntimeException("tada")
}
}
Как я могу прочитать массив объектов String и принять или преобразовать нулевые значения?
DefautlScalaModule
. - person François Beausoleil   schedule 19.04.2015