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

2

2 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 } 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.