我有以下Scala case class
:
case class InteractionPersona(
id: String,
geo: Option[(Option[String], Option[String], Option[String])])
使用Jackson时,我序列化了一个类的实例:
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
应表示为{{ 1}}值。
在How to deserialize Jackson Json NULL String to Date with JsonFormat中,@ wassgren建议使用None
注释使用转换器,在阅读文档后,我选择使用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
如何读取String对象数组并接受或转换空值?