
go语言的可见性规则规定,结构体中的字段如果需要被外部包访问或被encoding/json包处理,其名称必须以大写字母开头。然而,json数据格式的惯例通常倾向于使用小写字母、驼峰命名(camelcase)或蛇形命名(snake_case)作为键名。当我们将一个go结构体通过json.marshal转换为json字符串时,如果没有特殊处理,默认情况下会直接使用go结构体字段的大写名称作为json键名,例如:
type T struct {
Foo int
}
// ...
out, err := json.Marshal(&T{Foo: 42})
// 结果: {"Foo":42}这与我们期望的{"foo":42}不符,可能导致与前端或其他系统的数据交互问题。
encoding/json包提供了一种强大且灵活的机制来控制JSON序列化和反序列化的行为,即结构体字段标签(struct field tags)。通过在结构体字段声明后添加json:"key_name,options"形式的标签,我们可以指定JSON键名、忽略字段、处理空值等。
json标签的基本语法是json:"name,option1,option2..."。
示例:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"encoding/json"
"fmt"
)
// User 定义一个Go结构体,包含需要转换为小写JSON键名的字段
type User struct {
ID int `json:"id"` // 将大写ID映射为小写id
FirstName string `json:"first_name"` // 将FirstName映射为snake_case的first_name
LastName string `json:"last_name"` // 将LastName映射为snake_case的last_name
Email string `json:"email,omitempty"` // 如果Email为空字符串,则在JSON中省略
Password string `json:"-"` // 密码字段,完全忽略,不出现在JSON中
Age int `json:"user_age"` // 自定义键名
}
func main() {
// 示例1: 所有字段都有值
user1 := User{
ID: 1,
FirstName: "John",
LastName: "Doe",
Email: "john.doe@example.com",
Password: "securepassword123", // 此字段会被忽略
Age: 30,
}
jsonOutput1, err := json.MarshalIndent(user1, "", " ")
if err != nil {
fmt.Println("Error marshaling user1:", err)
return
}
fmt.Println("--- 示例1 (所有字段有值) ---")
fmt.Println(string(jsonOutput1))
// 期望输出:
// {
// "id": 1,
// "first_name": "John",
// "last_name": "Doe",
// "email": "john.doe@example.com",
// "user_age": 30
// }
fmt.Println("\n--- 示例2 (包含零值字段) ---")
// 示例2: 包含零值字段 (Email为空)
user2 := User{
ID: 2,
FirstName: "Jane",
LastName: "Smith",
Email: "", // Email为空字符串
Password: "anotherpassword",
Age: 25,
}
jsonOutput2, err := json.MarshalIndent(user2, "", " ")
if err != nil {
fmt.Println("Error marshaling user2:", err)
return
}
fmt.Println(string(jsonOutput2))
// 期望输出:
// {
// "id": 2,
// "first_name": "Jane",
// "last_name": "Smith",
// "user_age": 25
// }
// 注意:Email字段因omitempty被省略
}通过encoding/json包提供的结构体标签功能,Go语言开发者可以轻松、灵活地控制JSON序列化和反序列化的行为。无论是将大写字段名转换为小写、实现驼峰命名或蛇形命名,还是根据字段值有条件地省略字段,结构体标签都提供了一个简洁而强大的解决方案,确保Go应用程序能够生成符合各种API规范和数据格式要求的JSON数据。掌握这一技巧是Go语言进行Web开发和数据交换的关键能力之一。
以上就是Go语言encoding/json包:优雅实现JSON键名小写转换的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号