Как десериализовать массив строк со встроенным нулем, используя модуль Jackson с модулем Scala?

У меня есть следующий 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 и принять или преобразовать нулевые значения?


person François Beausoleil    schedule 19.04.2015    source источник
comment
Использование Jackson 2.3.5, потому что это самая последняя версия с предварительно собранными двоичными файлами для модуля Scala для серии Scala 2.9.1.   -  person François Beausoleil    schedule 19.04.2015
comment
Используете ли вы DefaultScalaModule? github.com/FasterXML/jackson-module-scala   -  person sap1ens    schedule 19.04.2015
comment
Есть излишество: используйте json4s и пишите правила для собственного сериализатора. (как здесь, например: stackoverflow.com/questions/29710814/< /а>)   -  person Nikita    schedule 19.04.2015
comment
Я регистрирую DefautlScalaModule.   -  person François Beausoleil    schedule 19.04.2015
comment
Я использовал DefaultScalaModule и обнаружил, что он не обрабатывает нулевые значения (т.е. те, которые объявлены, но не имеют значения, например: foo :) Невозможно десериализовать экземпляр java.lang.String из токена NOT_AVAILABLE   -  person Andrew Norman    schedule 23.02.2016