【问题标题】:How to unbox a JSON value of Int-length to Long using Jackson?如何使用 Jackson 将 Int-length 的 JSON 值拆箱为 Long?
【发布时间】:2014-12-19 14:37:56
【问题描述】:

我正在使用 Jackson 将 JSON 反序列化为 Map[String,Any]。 Jackson 试图根据它在 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,它会在此处拆箱,但似乎并非如此。我见过有人在类似的事情上使用模式匹配,但我仍然不知道在哪里/如何进行演员表。

【问题讨论】:

  • 进行模式匹配似乎有效。如果模式匹配显示 Int 那么我可以执行 result.asInstanceOf[Int].toLong
  • 如果在模式匹配中匹配Int,为什么需要asInstanceOfresult.toLong 应该没问题。

标签: json scala jackson


【解决方案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

【讨论】:

    【解决方案2】:

    您也可以使用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
    

    【讨论】:

    • 这是一个巧妙的解决方案。大多数时候,我的 Option[T] 实际上是 Option[Any] 。是否有可能以这种方式进行隐式工作?
    • 恐怕在这种情况下,item 上的模式匹配是最方便的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多