验证Json节点的数据类型(Jackson)

验证Json节点的数据类型(Jackson),json,scala,jackson,Json,Scala,Jackson,我正在使用Jackson解析解析一个Json,并将其保存到Hbase。在保存之前,我必须根据MySQL中的数据类型列表验证节点的数据类型。目前,我正在采用这种方法: def validateNode(node:JsonNode, DataType : String) :Any = { val nodeValue = node.toString() DataType.toLowerCase() match { case "double" ⇒ {

我正在使用Jackson解析解析一个Json,并将其保存到Hbase。在保存之前,我必须根据MySQL中的数据类型列表验证节点的数据类型。目前,我正在采用这种方法:

 def validateNode(node:JsonNode, DataType : String) :Any  = 
 {
      val nodeValue = node.toString()
      DataType.toLowerCase() match {
        case "double" ⇒ {
          try{
          d.toDouble
         }
     catch{
          }

        }
        case "int"    ⇒try { node.getValueAsInt } catch{}
        case "string" ⇒ try{ node.getTextValue }catch{}

      }

    }
我觉得很难看

a) 我捕获每个case块中的异常,以查看数据类型是否正确

有人能给我推荐一些优雅的代码吗

此外,我还必须处理一些数据类型,如
Array
Vector
。 例如:
JsonNode
类似于

 {"A":[[1,2],[2,4],[4,5]]} (==>Vector of Integer) .

您可以使用
JsonNode.getNodeType()
简化代码,它返回enum
JsonNodeType
。Jackson只构造有效节点,这意味着
JsonNodeType.BOOLEAN
必须来自JSON值
true
false
。另一种选择是使用各种
isXxx()
方法,如
node.isFloatingPointNumber()
。这比将值序列化为字符串,然后尝试将其重新解析为数字要有效得多。感谢StaxMan的建议。我可以很好地使用isXxx()方法,但是这些方法对于String、Double、Float、Int都有好处。但是我不能满足Vector的要求。因为JSON中的整数向量表示为[[1,2],[2,4],[3,4]],如果我使用JsonNodeType,这是一个数组。此外,我需要像Double的Vector、String的Vector、Int的Vector等这样的划分。请建议。JSON没有类型,它只有数组、对象等。这就是
JsonNode
可以显示的内容,因为它没有关于您想要使用的Java类型的任何信息。还要注意,JSON数组不是类型化的:它们可能包含任何JSON类型的值。案例中的输入来自Java端(Hibernate),您需要递归地验证它。您可以遍历
JsonNode
层次结构,匹配您拥有的
DataType