4

私は次の 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値ではありませんが、私は ScalaOption[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")
    }
}

残念ながら、そのコードは予想される例外を発生させません。a を使用しようとしてcontentConverterも、例外は発生しません。

@JsonDeserialize(contentConverter = classOf[GeoConverter])

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

String オブジェクトの配列を読み取り、null 値を受け入れたり変換したりするにはどうすればよいですか?

4

0 に答える 0