当前位置:首页 > Go > 正文

Go语言中的JSON处理技巧(如何正确序列化数字为字符串)

在使用 Go语言 开发 Web 应用或 API 时,我们经常需要将结构体数据转换为 JSON 格式。然而,在某些场景下(例如金融系统、高精度数值传输等),我们希望将数字以字符串形式进行 JSON 序列化,以避免浮点精度丢失或前端 JavaScript 的 Number 精度限制问题。

本文将手把手教你如何在 Go语言 JSON处理 中,将数字字段以字符串形式进行序列化和反序列化,即使是编程小白也能轻松掌握!

Go语言中的JSON处理技巧(如何正确序列化数字为字符串) Go语言 JSON处理 数字字符串序列化 Go JSON数字 第1张

为什么需要将数字转为字符串?

JavaScript 中的 Number 类型只能安全表示 -(2⁵³ - 1) 到 2⁵³ - 1 之间的整数(即 Number.MAX_SAFE_INTEGER)。超出此范围的整数在 JSON 传输后可能被错误解析。

此外,像金额、ID 等字段通常也不应参与数学运算,用字符串表示更安全、语义更清晰。

方法一:使用自定义 MarshalJSON / UnmarshalJSON

我们可以通过实现 json.Marshalerjson.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)}

方法二:使用结构体标签(适用于 float64)

从 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 标签仅适用于 float64float32intint64 等基本数字类型,不能用于自定义类型(如上面的 UserID)。

总结

Go JSON数字 处理中,若需将数字以字符串形式传输,推荐以下策略:

  • 对于基础类型(如 float64、int),使用 ,string 结构体标签,简单高效。
  • 对于自定义类型或复杂逻辑(如校验、格式化),实现 MarshalJSONUnmarshalJSON 方法。

掌握这些技巧后,你就能在 Go语言 JSON处理 中灵活控制数字的序列化方式,避免精度问题,提升系统健壮性!

希望这篇关于 数字字符串序列化 的教程对你有帮助。欢迎实践并分享你的经验!