Home > Article > Backend Development > How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?
Golang Json Unmarshal Numeric with Exponent
When unmarshaling JSON strings into structs that contain numeric values with exponents, you may encounter cases where the exponent is consistently truncated to 0. This issue can arise when the type of your struct field does not match the data type in the JSON.
In the example provided, the Id field of the Person struct is defined as uint64, which represents unsigned 64-bit integers. However, the value in the JSON string is a decimal number in scientific notation (1.2E 8).
Since Go cannot automatically convert a decimal with an exponent to an unsigned 64-bit integer, the result is truncated to 0.
How to Solve the Issue
To resolve this issue, you can modify the type of the Id field to match the data type in the JSON string. In this case, since the number is a decimal, you can use float32 or float64:
type Person struct { Id float32 `json:"id"` Name string `json:"name"` }
By updating the type to float32 or float64, Go can now correctly interpret the numerical value with an exponent and assign it to the Id field of the Person struct.
Alternatively, if you wish to preserve the original integer type for Id, you can use a custom JSON unmarshaler hook. This hook can convert the floating-point value to an integer before assigning it to the field:
type Person struct { Id int64 `json:"id"` Name string `json:"name"` } func (p *Person) UnmarshalJSON(b []byte) error { type Alias Person var a Alias if err := json.Unmarshal(b, &a); err != nil { return err } // Convert the float64 Id to int64 p.Id = int64(a.Id) return nil }
With the custom unmarshaler, the numeric value with an exponent in the JSON string will be correctly converted and assigned to the Id field of the Person struct.
The above is the detailed content of How to Handle Exponents in JSON Unmarshaling for Numeric Values in Go?. For more information, please follow other related articles on the PHP Chinese website!