一、Go語言的JSON處理
Go語言自帶有對JSON的支持,可以通過自帶的json包來處理JSON數據。json包提供了Encode和Decode函數來進行JSON與數據結構之間的轉換。其中,Encode函數將Go數據結構轉換為JSON格式,Decode函數則將JSON數據格式轉換為Go數據結構。
// Go結構體
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
// 將Go結構體轉換為JSON
user := User{Name: "Tom", Age: 18}
bytes, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(bytes))
// 將JSON數據轉換為Go結構體
data := []byte(`{"name": "Tom", "age": 18}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
log.Fatal(err)
}
fmt.Println(user.Name, user.Age)
二、從JSON到map的轉換
在某些情況下,我們需要將JSON數據轉換為map類型,方便進行數據訪問與處理。Go語言本身沒有提供直接將JSON數據轉換為map類型的方法,需要通過間接的方式來實現。
一種簡單的方法是先將JSON數據轉換為結構體,再將結構體轉換為map類型。
// 將JSON數據轉換為Go結構體
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
data := []byte(`{"name": "Tom", "age": 18}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
log.Fatal(err)
}
// 將結構體轉換為map類型
var result map[string]interface{}
bytes, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
if err := json.Unmarshal(bytes, &result); err != nil {
log.Fatal(err)
}
fmt.Println(result["name"].(string), result["age"].(int))
上述代碼中,我們先將JSON數據轉換為結構體,使用json.Marshal函數將結構體再轉換為JSON格式的位元組數組,再通過json.Unmarshal函數將位元組數組轉換為map類型。
然而,上述實現方法不如直接將JSON數據轉換為map類型方便。Go語言中的map類型是一種無序的鍵值對集合,能夠通過鍵名來訪問鍵值。由於JSON數據也是一種鍵值對結構,所以直接將JSON數據轉換為map類型是一種直接實現方式。
data := []byte(`{"name": "Tom", "age": 18}`)
var result map[string]interface{}
if err := json.Unmarshal(data, &result); err != nil {
log.Fatal(err)
}
fmt.Println(result["name"].(string), result["age"].(int))
上述代碼中,直接通過json.Unmarshal函數將JSON數據轉換為map類型,並通過鍵名來訪問鍵值。
三、處理嵌套數據結構
在JSON數據中,很常見的情況是嵌套的數據結構。對於這種情況,我們需要採取不同的方式來進行處理。
對於只有一層嵌套的情況,我們可以將結構體中的成員類型設置為map[string]interface{}類型,然後直接進行JSON轉換。
type User struct {
Name string `json:"name"`
Info map[string]interface{} `json:"info"`
}
data := []byte(`{"name": "Tom", "info": {"age": 18, "address": {"province": "江蘇", "city": "南京"}}}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
log.Fatal(err)
}
fmt.Println(user.Name, user.Info["age"].(float64), user.Info["address"].(map[string]interface{})["province"].(string))
對於多層嵌套的情況,我們需要進行逐層的轉換。可以通過將嵌套結構體定義為指針類型,在json.Unmarshal時傳入指針的方式來進行轉換。
type Address struct {
Province string `json:"province"`
City string `json:"city"`
}
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Address *Address `json:"address"`
}
data := []byte(`{"name": "Tom", "age": 18, "address": {"province": "江蘇", "city": "南京"}}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
log.Fatal(err)
}
fmt.Println(user.Name, user.Age, user.Address.Province, user.Address.City)
四、使用第三方庫簡化操作
除了使用Go語言自帶的json包外,還有一些第三方庫能夠幫助我們更方便地對JSON數據進行操作,例如github.com/bitly/go-simplejson、github.com/json-iterator/go等。
以go-simplejson為例,該庫支持將JSON數據轉換為map類型或直接訪問JSON數據中的某一個值。
import "github.com/bitly/go-simplejson"
data := []byte(`{"name": "Tom", "age": 18}`)
js, err := simplejson.NewJson(data)
if err != nil {
log.Fatal(err)
}
fmt.Println(js.Get("name").MustString(), js.Get("age").MustInt())
使用第三方庫能夠極大地簡化我們對JSON數據的處理,提高開發效率。
原創文章,作者:EUDB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/132324.html
微信掃一掃
支付寶掃一掃