答案:golang中处理JSON需用encoding/json库,固定结构用结构体加tag,动态结构用map[String]Interface{},数组用切片解析,序列化用json.Marshal,反序列化用json.Unmarshal,注意omitempty、类型断言和指针传递细节。

在golang中处理json数组与对象,主要依赖标准库 encoding/json。核心操作包括序列化(结构体转JSON)和反序列化(JSON转结构体或map)。下面介绍常见使用方式和技巧。
定义结构体处理JSON对象
如果JSON数据结构固定,推荐使用结构体。通过字段标签(tag)映射JSON键名。
示例:
type User struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` // omitempty 表示空值时忽略 }
使用 json.Unmarshal 解析JSON字符串到结构体:
jsonData := `{"name": "Alice", "age": 25}` var user User err := json.Unmarshal([]byte(jsonData), &user) if err != nil { log.Fatal(err) } fmt.Printf("%+vn", user) // 输出:{Name:Alice Age:25 Email:}
使用 map 处理动态JSON对象
当JSON结构不固定或字段未知时,可用 map[string]interface{} 接收。
立即学习“go语言免费学习笔记(深入)”;
Find JSON Path Online
30
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30 var data map[string]interface{} err := json.Unmarshal([]byte(jsonData), &data) if err != nil { log.Fatal(err) } fmt.Println(data["name"]) // 输出 Alice
注意:嵌套对象也会被解析为 map[string]interface{},访问时需类型断言。
处理JSON数组
JSON数组可解析为切片。若元素是对象,可使用结构体切片或 []map[string]interface{}。
结构体切片示例:
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` } jsonData := `[{"id":1,"name":"Laptop","price":999.9},{"id":2,"name":"Mouse","price":25.5}]` var products []Product err := json.Unmarshal([]byte(jsonData), &products) if err != nil { log.Fatal(err) } for _, p := range products { fmt.Printf("产品: %s, 价格: %.2fn", p.Name, p.Price) }
使用切片 + map 处理不确定结构:
var items []map[string]interface{} err := json.Unmarshal([]byte(jsonData), &items) if err != nil { log.Fatal(err) } for _, item := range items { fmt.Println("名称:", item["name"]) }
序列化结构体或map为JSON
使用 json.Marshal 将Go数据转换为JSON字节流。
user := User{Name: "Bob", Age: 30} data, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(data)) // 输出:{"name":"Bob","age":30,"email":""} // 格式化输出(带缩进) data, _ = json.MarshalIndent(user, "", " ") fmt.Println(string(data))
基本上就这些。关键是根据数据是否固定选择结构体还是map,合理使用 tag 控制字段行为。处理数组时注意目标类型的匹配。不复杂但容易忽略细节,比如指针传递和类型断言。
