使用encoding/json实现Go中JSON序列化与反序列化,通过结构体tag控制字段映射,omitempty忽略空值,-忽略私有字段,map[string]interface{}处理动态JSON,注意类型断言与浮点精度问题。

在Go语言中处理JSON数据非常常见,主要通过标准库 encoding/json 来实现序列化(结构体转JSON)和反序列化(JSON转结构体)。下面介绍基本用法、常用技巧以及注意事项。
使用 json.Marshal 可将Go结构体转换为JSON字符串。结构体字段需大写(导出),并通过 json tag 控制输出的键名。
package main
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"` // 当Email为空时不输出
Password string `json:"-"` // 不参与序列化
}
func main() {
user := User{
Name: "Alice",
Age: 30,
Email: "alice@example.com",
Password: "secret",
}
data, err := json.Marshal(user)
if err != nil {
panic(err)
}
fmt.Println(string(data))
// 输出:{"name":"Alice","age":30,"email":"alice@example.com"}
}
使用 json.Unmarshal 将JSON字节流解析到结构体变量中。确保结构体字段能正确映射JSON中的键。
func main() {
jsonData := `{"name":"Bob","age":25,"email":"bob@example.com"}`
var user User
err := json.Unmarshal([]byte(jsonData), &user)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", user)
// 输出:{Name:Bob Age:25 Email:bob@example.com Password:}
}
当不清楚JSON结构时,可使用 map[string]interface{} 或 interface{} 进行解析。
立即学习“go语言免费学习笔记(深入)”;
func main() {
jsonData := `{"name":"Charlie","hobbies":["reading","coding"]}`
var data map[string]interface{}
json.Unmarshal([]byte(jsonData), &data)
fmt.Printf("Name: %s\n", data["name"])
fmt.Printf("Hobbies: %v\n", data["hobbies"])
}
遍历嵌套数据时注意类型断言:
if hobbies, ok := data["hobbies"].([]interface{}); ok {
for _, h := range hobbies {
fmt.Println(h)
}
}
以上就是如何使用Golang处理JSON序列化与反序列化的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号