big.Int
реализует пользовательский маршалер JSON (json.Marshaler
), см. Int.MarshalJSON()
.Но у этого метода есть получатель указателя, поэтому он используется / вызывается, только если у вас есть значение указателя: *big.Int
.
И вы встраиваете не указательное значение, поэтому этот пользовательский маршалер не вызывается, ипоскольку big.Int
является структурой с неэкспортированными полями, в выводе вы увидите пустой объект JSON: {}
.
Чтобы заставить его работать, вы должны использовать указатель на ваш тип, например:
Amount *utils.BigInt `json:"amount,omitempty"`
Fee *utils.BigInt `json:"fee,omitempty"`
Пример использования:
s := SpendTx{
SenderID: "alice",
RecipientID: "bob",
Amount: &utils.BigInt{},
Fee: &utils.BigInt{},
}
data, err := s.JSON()
fmt.Println(string(data), err)
Тогда будет вывод, например (попробуйте на Go Playground ):
{"sender_id":"alice","recipient_id":"bob","amount":0,"fee":0} <nil>
Другой вариант - использовать не указатель utils.BigInt
, но тогда utils.BigInt
должен встроить указатель типа:
type BigInt struct {
*big.Int
}
type SpendTx struct {
Amount utils.BigInt `json:"amount,omitempty"`
Fee utils.BigInt `json:"fee,omitempty"`
}
, а затем использовать его:
s := SpendTx{
SenderID: "alice",
RecipientID: "bob",
Amount: utils.BigInt{new(big.Int)},
Fee: utils.BigInt{new(big.Int)},
}
data, err := s.JSON()
fmt.Println(string(data), err)
И вывод будетбыть снова (попробуйте на Go Playground ):
{"sender_id":"alice","recipient_id":"bob","amount":0,"fee":0} <nil>