我们假设我们有一个number + anotherNumber
对象JsonNode
,需要将其解析为多个类jsonNodeObj
,ClassA
,{{1}之一我可以做以下事情(不会更难看):
ClassB
是否有更好的方法,比如以某种方式使用ClassC
?
答案 0 :(得分:2)
肯定有更好的方法可以做到这一点。您可以定义一个函数,该函数在成功时返回true,在异常时返回false,如下所示:
inline fun <reified T : Any> ObjectMapper.treeToValueOrNull<T>(node : TreeNode) : T?
= try { treeToValue(node, T::class.java) }
catch (ex : Exception) { null }
这是有效的,因为在Kotlin中try
- catch
- 语句可以有一个返回值。现在,您可以使用when
来处理json:
lateinit var object : Any
when {
mapper.treeToValueOrNull<ClassA>(jsonNodeObj)?.let { object = it } != null
-> dosthA(object as ClassA)
mapper.treeToValueOrNull<ClassB>(jsonNodeObj)?.let { object = it } != null
-> dosthB(object as ClassB)
mapper.treeToValueOrNull<ClassC>(jsonNodeObj)?.let { object = it } != null
-> dosthC(object as ClassC)
}
pdvrieze found an even shorter solution:
val object = mapper.treeToValueOrNull<ClassA>(jsonNodeObj)
?: mapper.treeToValueOrNull<ClassB>(jsonNodeObj)
?: mapper.treeToValueOrNull<ClassC>(jsonNodeObj)