问题How to marshal JSON with bigints?是关于将big.Int
的值编组为JSON字符串。这个问题问,在JSON中,一个元组和一个元组 big.Int
如何将本机值作为数字?
以这种方式传递的大值可能与JSON的其他实现不兼容,尤其是JavaScript和jq,如RFC 7159所述:
请注意,当使用此类软件时,数字为整数和 在
[-(2**53)+1, (2**53)-1]
范围内,可以在 感觉实现将在数字上完全一致 值。
答案 0 :(得分:1)
创建自定义类型BigInt
,该自定义类型实现json.Marshaler
和json.Unmarshaler
,如下所示:
import (
"fmt"
"math/big"
)
type BigInt struct {
big.Int
}
func (b BigInt) MarshalJSON() ([]byte, error) {
return []byte(b.String()), nil
}
func (b *BigInt) UnmarshalJSON(p []byte) error {
if string(p) == "null" {
return nil
}
var z big.Int
_, ok := z.SetString(string(p), 10)
if !ok {
return fmt.Errorf("not a valid big integer: %s", p)
}
b.Int = z
return nil
}
理论上:
big.Int
的结构类型而不是big.Int
的子类型来实现,以便保留方法(Add,SetString等)BigInt
编组的值不必使用指针与big.Int
一样,零值很有用,它等于数字0。