我有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中有什么方法可以解决此问题? 我可以为其创建解串器吗?
答案 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())
}
}