Decoding JSON with Type Conversion from String to float64 in Go
Parsing JSON strings that contain float64 values can pose challenges when the values are stored as strings. To address this issue, Go provides a straightforward solution.
Understanding the Error:
When attempting to decode a JSON string like "{"name":"Galaxy Nexus", "price":"3460.00"}" using the json.Unmarshal function, you might encounter the following error:
json: cannot unmarshal string into Go value of type float64
This error occurs because the JSON decoder tries to convert the string representation of the float64 number to a float64 value directly, which is not supported.
Solution: Type Conversion Annotation
To resolve this issue, you need to explicitly instruct the decoder to treat the string as a float64 using a type conversion annotation. This annotation is added to the field definition in the Product struct:
type Product struct { Name string Price float64 `json:",string"` }
The ",string" tag tells the JSON decoder that the Price field is a string that should be converted to a float64.
Updated Code:
Here's the updated Go code:
package main import ( "encoding/json" "fmt" ) type Product struct { Name string Price float64 `json:",string"` } func main() { s := `{"name":"Galaxy Nexus", "price":"3460.00"}` var pro Product err := json.Unmarshal([]byte(s), &pro) if err == nil { fmt.Printf("% v\n", pro) } else { fmt.Println(err) fmt.Printf("% v\n", pro) } }
Expected Output:
Running this code will produce the expected output:
{Name:Galaxy Nexus Price:3460}
The json.Unmarshal function successfully decoded the JSON string and converted the price from a string to a float64.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3