在 Go 語言中,JSON 字段(也稱為 JSON Tag)是附加在結構體字段上的元數據,用于控制該字段在 JSON 編碼(序列化)和解碼(反序列化) 時的行為。它的語法是:
type StructName struct {FieldName FieldType `json:"json_field_name,option1,option2,..."`
}
例如:
type User struct {Name string `json:"name"` // 字段在 JSON 中顯示為 "name"Age int `json:"age,omitempty"` // 如果 Age 是零值,JSON 中會忽略它
}
JSON 字段的作用
指定 JSON 字段名
默認情況下,Go 結構體的字段名會直接作為 JSON 的鍵名(首字母大寫轉為小寫)。但通過 json
Tag,可以自定義 JSON 中的鍵名:
type Message struct {Sender string `json:"sender"` // Go 字段 `Sender` → JSON 鍵 `"sender"`
}
- 輸入 Go 結構體:
msg := Message{Sender: "Alice"}
- 輸出 JSON:
{"sender": "Alice"}
忽略空值字段
如果字段是零值(如 0
、""
、nil
),加上 omitempty
后,該字段不會出現在 JSON 中:
type User struct {Name string `json:"name,omitempty"` // 如果 Name 是 "",JSON 中不會包含該字段Age int `json:"age,omitempty"` // 如果 Age 是 0,JSON 中不會包含該字段
}
- 輸入 Go 結構體:
user := User{Age: 0}
- 輸出 JSON:
{}
忽略字段(-
)
如果某個字段不需要出現在 JSON 中,可以用 -
忽略它:
type Config struct {Password string `json:"-"` // 該字段不會參與 JSON 序列化
}
- 輸入 Go 結構體:
cfg := Config{Password: "123456"}
- 輸出 JSON:
{}
encoding/json
包
在 go 中,encoding/json
包下提供對應的函數來進行 json 的序列化與反序列化,主要使用的有如下函數。
func Marshal(v any) ([]byte, error) //將go對象序列化為json字符串func Unmarshal(data []byte, v any) error //將json字符串反序列化為go對象
首先定義結構體
type Person struct {UserId stringUsername stringAge intAddress string
}
序列化
func main() {person := Person{UserId: "120",Username: "jack",Age: 18,Address: "usa",}bytes, err := json.Marshal(person)if err != nil {fmt.Println(err)return}fmt.Println(string(bytes))
}
結果
{ "UserId": "120", "Username": "jack", "Age": 18, "Address": "usa" }
字段重命名
我們可以通過結構體標簽來達到重命名的效果。
type Person struct {UserId string `json:"id"`Username string `json:"name"`Age int `json:"age"`Address string `json:"address"`
}
此時輸出
{ "id": "1202", "name": "jack", "age": 19, "address": "USA" }
縮進
序列化時默認是沒有任何縮進的,這是為了減少傳輸過程的空間損耗,但是這并不利于人為觀察,在一些情況下我們需要將其序列化成人類能夠觀察的形式。為此,只需要換一個函數。
func main() {person := Person{UserId: "1202",Username: "jack",Age: 19,Address: "USA",}bytes, err := json.MarshalIndent(person, "", "\t")if err != nil {fmt.Println(err)return}fmt.Println(string(bytes))
}
輸出如下
{"id": "1202","name": "jack","age": 19,"address": "USA"
}
反序列化
在反序列化時需要注意,如果結構體有 json 標簽的話,則字段名優先以 json 標簽為準,否則以結構體屬性名為準。
func main() {person := Person{}jsonStr := "{\"id\":\"120\",\"name\":\"jack\",\"age\":18,\"address\":\"usa\"}\n"err := json.Unmarshal([]byte(jsonStr), &person)if err != nil {fmt.Println(err)return}fmt.Printf("%+v", person)
}
輸出
{UserId:120 Username:jack Age:18 Address:usa}
參考資料:
Golang 中文學習文檔 標準庫 encoding/json包