在kotlin中分支json解析的惯用方法

时间:2018-01-10 18:55:25

标签: json jackson kotlin

我们假设我们有一个number + anotherNumber对象JsonNode,需要将其解析为多个类jsonNodeObjClassA,{{1}之一我可以做以下事情(不会更难看):

ClassB

是否有更好的方法,比如以某种方式使用ClassC

1 个答案:

答案 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)