在处理外部api或遗留系统返回的json数据时,我们经常会遇到数据类型不一致的情况。一个常见场景是,json字段中表示数字的值被封装成了字符串,例如"price":"3460.00",而我们在go语言的结构体中期望将其解析为数值类型,如float64。
直接使用encoding/json包的Unmarshal函数进行解析时,如果JSON字段的类型与Go结构体字段的类型不匹配,Go会抛出类型转换错误。以下面的JSON字符串和Go结构体为例:
JSON数据:
{"name":"Galaxy Nexus", "price":"3460.00"}
Go结构体定义:
type Product struct { Name string Price float64 }
初始解码尝试:
立即学习“go语言免费学习笔记(深入)”;
package main import ( "encoding/json" "fmt" ) type Product struct { Name string Price float64 } 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) } }
运行上述代码,会得到如下错误信息:
json: cannot unmarshal string into Go value of type float64 {Name:Galaxy Nexus Price:0}
这明确指出encoding/json无法将一个JSON字符串直接转换为Go的float64类型。
Go语言的encoding/json包提供了一种强大且简洁的机制来处理这种类型不匹配问题:结构体标签(Struct Tags)。通过在结构体字段上添加特定的标签,我们可以指示json.Unmarshal函数在解码时执行特定的行为,包括将字符串格式的数字转换为数值类型。
解决上述问题的关键在于在Price字段上添加json:",string"标签。
修改后的Go结构体定义:
type Product struct { Name string Price float64 `json:",string"` // 关键修改在这里 }
json:",string"标签的作用是告诉encoding/json包,在解析JSON数据时,如果对应的JSON字段是一个字符串,即使目标Go字段是数值类型(如float64、int等),也尝试将其字符串值解析为该数值类型。
完整的解决方案代码:
package main import ( "encoding/json" "fmt" ) type Product struct { Name string Price float64 `json:",string"` // 添加`,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) } }
运行这段修改后的代码,将得到预期的正确输出:
{Name:Galaxy Nexus Price:3460}
可以看到,Price字段已成功地从JSON字符串"3460.00"转换并赋值为Go结构体中的float64类型3460。
Go语言的encoding/json包通过其灵活的结构体标签机制,为处理JSON数据提供了强大的支持。当遇到JSON中以字符串形式表示的数字需要转换为Go结构体中的数值类型时,json:",string"标签是一个简洁而有效的解决方案。它避免了手动解析和类型转换的繁琐,使得JSON解码过程更加流畅和健壮。理解并善用这些标签是Go开发者处理JSON数据时的重要技能。
以上就是Go语言中JSON字符串数字转换为浮点数解析指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号