4

我有以下斯卡拉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值。

How to deserialize Jackson Json NULL String to Date with 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")
    }
}

不幸的是,该代码不会引发预期的异常。尝试使用 acontentConverter也不会引发任何异常:

@JsonDeserialize(contentConverter = classOf[GeoConverter])

class GeoConverter extends StdConverter[String, Option[String]] {
    override def convert(value: String): Option[String] = {
        throw new RuntimeException("tada")
    }
}

如何读取字符串对象数组并接受或转换空值?

4

0 回答 0