簡體   English   中英

如何使用Jackson將Int-length的JSON值拆箱為Long?

[英]How to unbox a JSON value of Int-length to Long using Jackson?

我正在使用JacksonMap[String,Any]進行JSON反序列化。 Jackson嘗試根據在JSON中看到的內容推斷我的數字類型。 問題在於,有時我會變Long而有時我會變Int具體取決於值的實際大小。

我在嘗試編寫一種方法時遇到麻煩,無論該方法是Long還是Int該方法都可以將值轉換為Long 我一直在開箱時出現錯誤,因為在沒有提前明確知道它是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來取消裝箱,但事實並非如此。 我見過人們使用模式匹配進行類似的操作,但是我仍然不知道在哪里/如何進行轉換。

您可以嘗試模式匹配,如下所示:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM