Десериализация JSON с полями, которые могут иметь разные типы (используя Джексона и Скала) - PullRequest
0 голосов
/ 28 января 2019

У меня есть 2 формата JSON (example_json1, example_json2) и простой класс Address для анализа JSON с использованием Scala.Я могу получить JSON с типом поля String или StringWrapper.

Как я могу их обобщить?

Теперь этот код может преобразовать только "example_json1" в объект Address.

object AdressJson {
  val example_json1 =
    """{
      "value":
         {
           "string":"MY ADDRESS"
         }
    }"""

  val example_json2 =
    """{
      "value":"STREET"
    }"""
}



object Main {
  val mapper = new ObjectMapper() with ScalaObjectMapper
  mapper.registerModule(DefaultScalaModule)
  mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)

  def main(args: Array[String]): Unit = {
    val parsedJson = mapper.readValue(AdressJson.example_json1, classOf[Address])
    println(parsedJson)
  }
} 



case class Address(value: StringWrapper)

case class StringWrapper(string: String)

Я хочу иметь такой код, который мог бы работать с обоими этими типами (и, возможно, даже с большим количеством типов).

Могу ли я создать универсальный код для этого без использования instanceOf какв Java?Каковы подходы в Scala для решения этой проблемы?Могу ли я создать десериализатор для него?

1 Ответ

0 голосов
/ 29 января 2019

Мое решение:

case class Address(@JsonDeserialize(using = classOf[AdminStatusDesializer])
                   value: StringWrapper)

class AdminStatusDesializer extends JsonDeserializer[StringWrapper]{
 override def deserialize(p: JsonParser, ctxt: DeserializationContext): StringWrapper = {
   val oc = p.getCodec()
   val node:JsonNode  = oc.readTree(p)
   if(node.isNull)StringWrapper(null)
   if(node.isTextual) StringWrapper(node.asText())
   else StringWrapper(node.get("string").asText())
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...