[英]How to unbox a JSON value of Int-length to Long using Jackson?
我正在使用Jackson對Map[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.