Trying to get balance of Tron wallet using tronscan.org
Sometimes Amount returns string, sometimes value like this
"amount": 1.4900288469458728E-8 When it returns value of this type i get this error json: cannot unmarshal number into Go struct field .Amount of type string
Here is my struct:
type trxResponse struct { Data []struct { Amount float64 `json:"amount,string"` } `json:"data"` } How can I handle it? To unmarshal json i'm using
22 Answers
As the amount field has different types, it can be declared as interface{} type, this will solve unmarshaling error.
type trxResponse struct { Data []struct { Amount interface{} `json:"amount"` } `json:"data"` } This can then be typecast from/to float64 or string as needed..
You can implement the Unmarshaler interface by declaring custom UnmarshalJSON method, which will handle the amount field according to the type.
type trxData struct { Amount float64 `json:"amount"` } type trxResponse struct { Data []trxData `json:"data"` } // UnmarshalJSON custom method for handling different types // of the amount field. func (d *trxData) UnmarshalJSON(data []byte) error { var objMap map[string]*json.RawMessage // unmarshal json to raw messages err := json.Unmarshal(data, &objMap) if err != nil { return err } var amount float64 // try to unmarshal to float64 if rawMsg, ok := objMap["amount"]; ok { if err := json.Unmarshal(*rawMsg, &amount); err != nil { // if failed, unmarshal to string var amountStr string if err := json.Unmarshal(*rawMsg, &amountStr); err != nil { return err } amount, err = strconv.ParseFloat(amountStr, 64) if err != nil { return err } } } d.Amount = amount return nil }