1

我正在使用一个案例类,它在其他参数中是用 BigInt 十六进制值实例化的。我使用这个案例类通过 Jerkson/Jackson 反序列化 JSON 消息。使用 Jackson 的美妙之处在于,反序列化可以根据案例类的签名(我猜)开箱即用。

现在,一个十六进制编码的 BigInt 值需要用一个额外的基数参数来实例化:BigInt(hexValue, 16)。但是我的 JSON 消息不包含这样的参数。我正在寻找一种解决方案来在我的案例类的定义中定义这个基数,以便杰克逊能够继续使用该类而无需配置。就像是:

case class MyClass(name: String, hexValue: BigInt(hexValue, 16))

我知道替代方法是 a) 明确定义 JSON 反序列化或 b) 围绕 BigInt 定义我自己的包装类。但是,我正在寻找一个更优雅和“scala-ish”的解决方案——如果有的话。

注意:Int 是不够的,它必须是 BigInt。

4

2 回答 2

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)
于 2013-02-09T04:24:00.697 回答
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)
于 2013-02-09T04:28:49.390 回答