• 常用
  • 百度
  • google
  • 站内搜索

数码

Golang使用encoding/json进行JSON解析与序列化实践

  • 更新日期:2025-11-28
  • 查看次数:4552

Go语言通过encoding/json包实现JSON处理,使用struct tag如json:"name"映射字段,omitempty忽略空值;通过json.Unmarshal解析JSON到结构体或map,json.Marshal将对象序列化为JSON字符串,支持MarshalIndent格式化输出;time.Time等特殊类型可通过实现Marshaler接口自定义处理,建议字段导出、合理使用指针与空值处理,避免常见错误。

Golang如何使用encoding/json解析JSON_Golang JSON解析与序列化实践

在Go语言中处理JSON数据非常常见,尤其是在构建Web服务或与API交互时。encoding/json 包提供了完整的JSON解析与序列化支持。掌握它的基本用法和一些细节,能有效提升开发效率并避免常见错误。

1. 基本的结构体映射(Struct Tag)

Go通过结构体字段标签(struct tag)来控制JSON字段的映射关系。最常用的格式是 json:"fieldName"

示例:

type User struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
    Email string `json:"email,omitempty"` // 当为空时不输出
}

说明:

  • json:"fieldName" 指定JSON中的键名
  • omitempty 表示该字段为空(零值)时,在序列化中忽略
  • 字段必须是大写(导出),否则无法被 json 包访问

2. 反序列化:JSON字符串转Go对象

使用 json.Unmarshal 将JSON数据解析为结构体或map。

data := `{"id": 1, "name": "Alice", "email": "alice@example.com"}`
var user User
err := json.Unmarshal([]byte(data), &user)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%+v\n", user)

也可以解析到 map[string]interface{},适用于结构未知的情况:

var result map[string]interface{}
json.Unmarshal([]byte(data), &result)
fmt.Println(result["name"]) // 输出: Alice

3. 序列化:Go对象转JSON字符串

使用 json.Marshal 将Go结构体或map转换为JSON字节流。

user := User{ID: 2, Name: "Bob"}
jsonData, err := json.Marshal(user)
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(jsonData)) // {"id":2,"name":"Bob"}

如需格式化输出,可使用 json.MarshalIndent

pretty, _ := json.MarshalIndent(user, "", "  ")
fmt.Println(string(pretty))

4. 处理特殊类型和自定义逻辑

某些类型如 time.Time、int64 转字符串ID等需要特别处理。

例如,带时间戳的结构体:

type Post struct {
    Title string    `json:"title"`
    Created time.Time `json:"created"`
}

默认情况下,time.Time 会以RFC3339格式输出。如果希望自定义格式,可以实现 json.Marshalerjson.Unmarshaler 接口。

另外,对于可能为null的字段,使用指针或 *sql.NullString 等类型更安全。

5. 常见问题与建议

  • 确保结构体字段首字母大写,否则不会被解析
  • 使用 omitempty 减少冗余输出
  • 嵌套结构也支持,字段类型匹配即可
  • 反序列化时,多余JSON字段会被忽略,缺少字段则赋零值
  • 性能敏感场景可考虑 github.com/json-iterator/go 替代原生包
基本上就这些。熟练使用 encoding/json 是Golang开发的基础能力,理解结构体标签和空值处理能避免多数坑。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken