我正在使用一个案例类 - 其中包括其他参数 - 使用BigInt十六进制值进行实例化。我使用此案例类通过Jerkson / Jackson反序列化JSON消息。使用Jackson的美妙之处在于de / serialization基于其签名(我猜)在案例类中开箱即用。
现在,十六进制编码中的BigInt值需要使用额外的基数参数进行实例化:BigInt(hexValue,16)。但是,我的JSON消息不包含此类参数。我正在寻找一个解决方案,在我的case类定义中定义这个基数,这样Jackson就能继续使用没有配置的类。类似的东西:
case class MyClass(name: String, hexValue: BigInt(hexValue, 16))
我理解替代方法是a)明确定义JSON de / serialization或b)围绕BigInt定义我自己的包装类。但是我正在寻找更优雅的“scala-ish”解决方案 - 如果有的话。
注意:Int是不够的,它必须是BigInt。
答案 0 :(得分:2)
您可以覆盖apply
方法来自定义case class
实例化..
case class MyClass (name: String, hexValue: BigInt)
object MyClass{
def apply(name: String, hexValue: String) =
new MyClass(name,BigInt(hexValue,16))
}
将其用作
MyClass("Foo","29ABCDEF") //> res0: MyClass = MyClass(Foo,699125231)
答案 1 :(得分:1)
我认为你最好的选择是使用BigInt
上的包装器。像
import java.math.BigInteger
class BigHexInt(hexString: String)
extends BigInt(new BigInteger(hexString, 16))
然后使用case class
:
BigHexInt
case class MyClass(name: String, bigHex: BigHextInt)