Golang如何實現(xiàn)JSON處理 解析marshal與unmarshal的用法

golang 中處理 json 數(shù)據(jù)主要通過 encoding/json 包中的 json.marshal 和 json.unmarshal 實現(xiàn)。1. 使用 json.marshal 可將結(jié)構(gòu)體轉(zhuǎn)為 json 字符串,需注意字段導出、標簽控制和 omitempty 的使用;2. 使用 json.unmarshal 可將 json 字符串解析為結(jié)構(gòu)體,需傳入指針且忽略多余字段;3. 支持嵌套結(jié)構(gòu)及通過 map 處理不確定結(jié)構(gòu)的 json 數(shù)據(jù),提升靈活性。掌握這些方法可應對大多數(shù) json 場景。

Golang如何實現(xiàn)JSON處理 解析marshal與unmarshal的用法

golang 中處理 JSON 數(shù)據(jù)非常常見,尤其是在開發(fā) Web 應用或 API 接口時。Go 標準庫中的 encoding/json 包提供了兩個核心函數(shù):json.Marshal 和 json.Unmarshal,分別用于將結(jié)構(gòu)體轉(zhuǎn)換為 JSON 數(shù)據(jù)(序列化)以及將 JSON 數(shù)據(jù)還原為結(jié)構(gòu)體(反序列化)。下面我們就來看看它們的典型用法和注意事項。

Golang如何實現(xiàn)JSON處理 解析marshal與unmarshal的用法


1. 使用 json.Marshal 將結(jié)構(gòu)體轉(zhuǎn)為 JSON 字符串

當你需要把 Go 的結(jié)構(gòu)體、map 或者切片數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)成 JSON 格式字符串時,就可以使用 json.Marshal 函數(shù)。

Golang如何實現(xiàn)JSON處理 解析marshal與unmarshal的用法

基本用法如下:

立即學習go語言免費學習筆記(深入)”;

type User struct {     Name  String `json:"name"`     Age   int    `json:"age"`     Email string `json:"email,omitempty"` // omitempty 表示如果為空則不輸出該字段 }  user := User{     Name: "Alice",     Age:  25, }  data, _ := json.Marshal(user) fmt.Println(string(data)) // 輸出: {"name":"Alice","age":25}

注意點:

Golang如何實現(xiàn)JSON處理 解析marshal與unmarshal的用法

  • 結(jié)構(gòu)體字段必須是導出的(首字母大寫),否則不會被序列化。
  • 可以通過 json:”name” 這樣的標簽來控制字段名。
  • 使用 omitempty 可以避免空值字段出現(xiàn)在結(jié)果中。

2. 使用 json.Unmarshal 將 JSON 字符串轉(zhuǎn)為結(jié)構(gòu)體

當你從網(wǎng)絡(luò)接收到一段 JSON 數(shù)據(jù),想要把它解析為 Go 的結(jié)構(gòu)體變量時,就用 json.Unmarshal。

基本用法如下:

立即學習go語言免費學習筆記(深入)”;

jsonStr := `{"name":"Bob","age":30,"email":"bob@example.com"}`  var user User err := json.Unmarshal([]byte(jsonStr), &user) if err != nil {     log.Fatal(err) }  fmt.Printf("%+vn", user) // 輸出: {Name:Bob Age:30 Email:bob@example.com}

注意點:

  • 解析目標必須是指針類型,否則不會修改原始變量。
  • 如果 JSON 中有字段在結(jié)構(gòu)體中不存在,會被忽略。
  • 如果結(jié)構(gòu)體字段名與 JSON 鍵名不同,可以使用標簽匹配。

3. 嵌套結(jié)構(gòu)與 map 處理更靈活

除了簡單的結(jié)構(gòu)體,你也可以處理嵌套結(jié)構(gòu)或者直接使用 map[string]Interface{} 來應對不確定結(jié)構(gòu)的 JSON 數(shù)據(jù)。

例如嵌套結(jié)構(gòu):

type Address struct {     City  string `json:"city"`     Zip   string `json:"zip"` }  type User struct {     Name    string  `json:"name"`     Address Address `json:"address"` }  jsonStr := `{"name":"Charlie","address":{"city":"Shanghai","zip":"200000"}}` var user User json.Unmarshal([]byte(jsonStr), &user)

用 map 處理動態(tài)結(jié)構(gòu):

var data map[string]interface{} json.Unmarshal([]byte(jsonStr), &data)  fmt.Println(data["name"])       // Charlie fmt.Println(data["address"])    // map[city:Shanghai zip:200000]

這種方式適合不知道具體結(jié)構(gòu),或者結(jié)構(gòu)可能變化的情況。


基本上就這些了。掌握好 json.Marshal 和 json.Unmarshal 的使用方式,配合結(jié)構(gòu)體標簽和 map,就能處理大多數(shù) JSON 場景了。雖然看起來簡單,但在字段命名、嵌套結(jié)構(gòu)和類型匹配上稍不注意就會出錯,建議多測試邊界情況。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊10 分享