如何使用Jackson将Int-length的JSON值拆分为Long?

时间:2014-12-19 14:37:57

标签: json scala jackson

我使用 Jackson 进行JSON反序列化到Map[String,Any]。杰克逊试图根据它在JSON中看到的内容来推断我的数字类型。这样做的问题是,有时我会收到Long,有时我会Int获取Long,具体取决于值的实际大小。

我无法尝试编写一种方法,无论是Long还是Int,都可以将该值转换为Long。 。我一直在取消装箱时遇到错误,因为如果没有提前知道它是Int还是Long,我似乎无法找到将其投放到def getIntOrLongAsLong[T: Manifest](item: Option[T], default:Long): Long = { if(item == None) default else { val result = item.get result.asInstanceOf[Long] } } 无论如何。

我正在尝试这个:

item.get

我希望通过将val分配到{{1}},它会在那里取消装箱,但它似乎并非如此。我已经看到人们使用模式匹配来做类似的事情,但我仍然不知道在哪里/如何进行演员表。

2 个答案:

答案 0 :(得分:1)

您可以尝试模式匹配,如下所示:

def getIntOrLongAsLong[T: Manifest](item: Option[T], default:Long): Long = item match{
    case None => default
    case Some(x:Int) => x.toLong
    case Some(x:Long) => x
    case _   => default
}

scala> getIntOrLongAsLong(Some('a'), 5L)
res0: Long = 5

scala> getIntOrLongAsLong(Some(1), 5L)
res2: Long = 1

scala> getIntOrLongAsLong(Some(1000000000L), 5L)
res3: Long = 1000000000

答案 1 :(得分:1)

您还可以使用Integral类型类:

import scala.math.Numeric._
def getIntOrLongAsLong[T](item: Option[T], default: Long)
                         (implicit num: Integral[T]): Long = {
    item.map(n => num.toLong(n)).getOrElse(default)
}

这也适用于其他整数类型:

  getIntOrLongAsLong(Some(5L), 42L)          // == 5L
  getIntOrLongAsLong(Some(3), 42L)           // == 3L
  getIntOrLongAsLong(None: Option[Int], 42L) // == 42L
  getIntOrLongAsLong(Some(3:Short), 42L)     // == 3L