Go语言内置的encoding/json标准库提供了完善的JSON数据处理能力,开发者可以通过该库完成JSON字符串的解码、字段提取等操作,无需引入第三方依赖即可满足大部分业务场景的需求。
基础结构体解码JSON
最常见的JSON解码场景是将JSON字符串映射到预定义的结构体,通过结构体标签可以指定JSON字段与结构体字段的映射关系,即使字段名不一致也能正确匹配。
package main
import (
"encoding/json"
"fmt"
)
// 定义结构体,使用struct_tag指定JSON字段映射
type User struct {
Name string `json:"name"` // JSON中的name字段映射到Name
Age int `json:"age"` // JSON中的age字段映射到Age
Email string `json:"email"` // JSON中的email字段映射到Email
}
func main() {
jsonStr := `{"name":"张三","age":25,"email":"test@ipipp.com"}`
var user User
// 解码JSON到结构体
err := json.Unmarshal([]byte(jsonStr), &user)
if err != nil {
fmt.Println("解码失败:", err)
return
}
// 访问结构体字段
fmt.Println("姓名:", user.Name)
fmt.Println("年龄:", user.Age)
fmt.Println("邮箱:", user.Email)
}
处理嵌套JSON结构
当JSON数据存在嵌套结构时,可以在结构体中定义嵌套的结构体类型,同样通过struct_tag完成映射,实现多层字段的访问。
package main
import (
"encoding/json"
"fmt"
)
// 嵌套的结构体定义
type Address struct {
City string `json:"city"`
Street string `json:"street"`
}
type Employee struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"` // 嵌套Address结构体
}
func main() {
jsonStr := `{"name":"李四","age":30,"address":{"city":"北京","street":"中关村大街"}}`
var emp Employee
err := json.Unmarshal([]byte(jsonStr), &emp)
if err != nil {
fmt.Println("解码失败:", err)
return
}
fmt.Println("姓名:", emp.Name)
fmt.Println("城市:", emp.Address.City)
fmt.Println("街道:", emp.Address.Street)
}
动态访问未知结构的JSON
如果JSON结构不确定,无法提前定义结构体,可以使用map[string]interface{}类型接收解码后的数据,再通过类型断言访问对应字段。
package main
import (
"encoding/json"
"fmt"
)
func main() {
jsonStr := `{"product":"笔记本","price":4999,"specs":{"cpu":"i7","memory":"16G"}}`
var data map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &data)
if err != nil {
fmt.Println("解码失败:", err)
return
}
// 访问顶层字段
product, ok := data["product"].(string)
if ok {
fmt.Println("产品名:", product)
}
// 访问嵌套字段
specs, ok := data["specs"].(map[string]interface{})
if ok {
cpu, ok := specs["cpu"].(string)
if ok {
fmt.Println("CPU:", cpu)
}
}
}
常见注意事项
- 结构体字段首字母必须大写,否则json包无法访问该字段,导致解码后字段值为零值
- struct_tag中如果指定
omitempty,当字段为零值时,编码JSON时会忽略该字段,解码时不影响映射 - 使用
map[string]interface{}访问字段时,必须进行类型断言,否则可能出现运行时错误 - 如果JSON字段名包含特殊字符,可以在struct_tag中用反引号包裹字段名,比如
`json:"user-name"`
错误处理建议
解码JSON时一定要处理返回的错误,常见的错误包括JSON格式不合法、字段类型不匹配等,通过错误信息可以快速定位问题。如果需要严格校验JSON字段,可以自定义解码逻辑,或者在解码后增加字段合法性校验步骤。
GoJSON解码字段访问struct_tag修改时间:2026-06-24 20:09:30