具有可以具有不同类型的字段的JSON反序列化(使用Jackson和Scala)

时间:2019-01-28 19:22:45

标签: json scala types jackson

我有2种JSON格式(example_json1,example_json2)和使用Scala进行JSON解析的简单类Address。 我可以使用字段类型为String或StringWrapper的JSON。

如何概括它们?

现在,此代码可以将唯一的“ 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)

我想拥有可以同时用于这两种类型(甚至更多类型)的代码。

是否可以不使用Java中的instanceOf来为此创建通用代码? Scala中有什么方法可以解决此问题? 我可以为其创建解串器吗?

1 个答案:

答案 0 :(得分:0)

我的解决方案:

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())
 }
}