Go語言通過encoding/json庫解析JSON,可定義結(jié)構(gòu)體并使用json.Unmarshal將數(shù)據(jù)解碼到結(jié)構(gòu)中,支持struct、map[string]interface{}和切片接收,字段需導(dǎo)出并用json標(biāo)簽匹配鍵名,動態(tài)解析需注意類型斷言,數(shù)字默認(rèn)為float64;數(shù)組用[]T接收;大文件或HTTP響應(yīng)可用json.NewDecoder流式處理。
Go語言通過標(biāo)準(zhǔn)庫encoding/json
提供了對JSON數(shù)據(jù)的編碼和解碼支持。使用它解析JSON非常直接,關(guān)鍵在于合理定義結(jié)構(gòu)體或使用內(nèi)置類型接收數(shù)據(jù)。
最常見的方式是根據(jù)JSON結(jié)構(gòu)定義對應(yīng)的Go結(jié)構(gòu)體,然后使用json.Unmarshal
將JSON字節(jié)流解析到結(jié)構(gòu)體中。
例如,有如下JSON數(shù)據(jù):
{"name": "Alice", "age": 30, "email": "alice@example.com"}可以定義一個結(jié)構(gòu)體來匹配:
立即學(xué)習(xí)“go語言免費學(xué)習(xí)筆記(深入)”;
type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email"` }
然后解析:
jsonData := []byte(`{"name": "Alice", "age": 30, "email": "alice@example.com"}`) var p Person err := json.Unmarshal(jsonData, &p) if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", p)
結(jié)構(gòu)體字段后的json:"xxx"
標(biāo)簽用于指定對應(yīng)JSON中的鍵名。
如果JSON結(jié)構(gòu)不確定,可以使用map[string]interface{}
或interface{}
來接收。
比如解析一個不知道具體字段的JSON對象:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
var data map[string]interface{} err := json.Unmarshal(jsonData, &data) if err != nil { log.Fatal(err) } for k, v := range data { fmt.Printf("%s: %v (%T)\n", k, v, v) }
注意:JSON中的數(shù)字默認(rèn)會被解析為float64
,字符串為string
,布爾值為bool
,數(shù)組為[]interface{}
。
當(dāng)JSON是一個數(shù)組時,可以用切片接收。
[{"name":"Alice","age":30},{"name":"Bob","age":25}]定義結(jié)構(gòu)體并解析:
type Person struct { Name string `json:"name"` Age int `json:"age"` } var people []Person err := json.Unmarshal(jsonData, &people) if err != nil { log.Fatal(err) } for _, p := range people { fmt.Printf("%s is %d years old\n", p.Name, p.Age) }
實際開發(fā)中,JSON常來自文件或網(wǎng)絡(luò)。可使用json.NewDecoder
直接讀取json.Unmarshal
0。
例如從HTTP響應(yīng)解析:
resp, err := http.Get("https://api.example.com/data.json") if err != nil { log.Fatal(err) } defer resp.Body.Close() var result map[string]interface{} err = json.NewDecoder(resp.Body).Decode(&result) if err != nil { log.Fatal(err) } fmt.Println(result)
json.Unmarshal
1適合處理大文件或流式數(shù)據(jù),而json.Unmarshal
2更適合已加載到內(nèi)存的json.Unmarshal
3。
基本上就這些。只要結(jié)構(gòu)清晰,無論是靜態(tài)結(jié)構(gòu)還是動態(tài)內(nèi)容,encoding/json
都能有效處理。關(guān)鍵是根據(jù)場景選擇結(jié)構(gòu)體、map還是切片來接收數(shù)據(jù)。不復(fù)雜但容易忽略細(xì)節(jié),比如字段導(dǎo)出、標(biāo)簽匹配和類型斷言。
以上就是Golang如何使用encoding/json解析JSON的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進(jìn)程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號