在使用 Go语言 开发 Web 应用或 API 时,我们经常需要将结构体数据转换为 JSON 格式。然而,在某些场景下(例如金融系统、高精度数值传输等),我们希望将数字以字符串形式进行 JSON 序列化,以避免浮点精度丢失或前端 JavaScript 的 Number 精度限制问题。
本文将手把手教你如何在 Go语言 JSON处理 中,将数字字段以字符串形式进行序列化和反序列化,即使是编程小白也能轻松掌握!
JavaScript 中的 Number 类型只能安全表示 -(2⁵³ - 1) 到 2⁵³ - 1 之间的整数(即 Number.MAX_SAFE_INTEGER)。超出此范围的整数在 JSON 传输后可能被错误解析。
此外,像金额、ID 等字段通常也不应参与数学运算,用字符串表示更安全、语义更清晰。
我们可以通过实现 json.Marshaler 和 json.Unmarshaler 接口来自定义序列化行为。
package mainimport ( "encoding/json" "fmt" "strconv")// UserID 自定义类型,用于表示用户IDtype UserID int64// MarshalJSON 实现 json.Marshaler 接口func (id UserID) MarshalJSON() ([]byte, error) { return []byte(`"` + strconv.FormatInt(int64(id), 10) + `"`), nil}// UnmarshalJSON 实现 json.Unmarshaler 接口func (id *UserID) UnmarshalJSON(data []byte) error { // 去掉首尾引号 str := string(data[1 : len(data)-1]) val, err := strconv.ParseInt(str, 10, 64) if err != nil { return err } *id = UserID(val) return nil}type User struct { ID UserID `json:"user_id"` Name string `json:"name"`}func main() { user := User{ID: 1234567890123456789, Name: "Alice"} // 序列化 data, _ := json.Marshal(user) fmt.Println(string(data)) // 输出: {"user_id":"1234567890123456789","name":"Alice"} // 反序列化 var newUser User json.Unmarshal(data, &newUser) fmt.Printf("ID: %d, Name: %s\n", newUser.ID, newUser.Name)} 从 Go 1.10 开始,encoding/json 包支持 string 标签,可直接将 float64 或 int 类型以字符串形式编码。
type Product struct { Price float64 `json:"price,string"` Count int `json:"count,string"`}func main() { p := Product{Price: 99.99, Count: 100} data, _ := json.Marshal(p) fmt.Println(string(data)) // 输出: {"price":"99.99","count":"100"} var newP Product json.Unmarshal([]byte(`{"price":"99.99","count":"100"}`), &newP) fmt.Printf("Price: %.2f, Count: %d\n", newP.Price, newP.Count)} 注意:,string 标签仅适用于 float64、float32、int、int64 等基本数字类型,不能用于自定义类型(如上面的 UserID)。
在 Go JSON数字 处理中,若需将数字以字符串形式传输,推荐以下策略:
,string 结构体标签,简单高效。MarshalJSON 和 UnmarshalJSON 方法。掌握这些技巧后,你就能在 Go语言 JSON处理 中灵活控制数字的序列化方式,避免精度问题,提升系统健壮性!
希望这篇关于 数字字符串序列化 的教程对你有帮助。欢迎实践并分享你的经验!
本文由主机测评网于2025-12-21发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251210944.html