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

标签 json jackson kotlin

假设我们有一个 JsonNode 对象 jsonNodeObj 需要解析为多个类之一 ClassA, ClassBClassC 等。我可以执行以下操作(不能更丑陋):

val mapper = ObjectMapper()
try {
  mapper.treeToValue(jsonNodeObj, ClassA::class.java)
} catch (e1: Exception) {
  try {
    mapper.treeToValue(jsonNodeObj, ClassB::class.java)
  } catch (e2: Exception) {
    try {
      mapper.treeToValue(jsonNodeObj, ClassC::class.java)
    } catch (e3: Exception) {
      ...
    }
  }
}

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

最佳答案

肯定有更好的方法来做到这一点。您可以定义一个函数,它在成功时返回 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-statements 可以有一个返回值。现在,您可以使用 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)

关于json - 在 kotlin 中分支 json 解析的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48194303/

相关文章:

C 字符串有随机尾随字符、空终止问题?

javascript - 如何导入里面有函数的JSON对象?

java - jackson 制作 cookie

android - 如何让LiveData在另外两个LiveData之间切换

kotlin - Kotlin 函数中接收者和参数的类型相同

javascript/json 日期文字

javascript - 通过 Highcharts 从 MySQL 获取 JSON 编码数据时遇到问题

android - Jackson Parser 解析大写属性的模型类

java - JsonMappingException : No suitable constructor found for type [simple type, 类 com.fasterxml.jackson.databind.node.ObjectNode]

android - ObjectAnimator 的一部分未与 API 级别 23 以下的 AnimationSet playTogether() 同时播放