在 Golang 中,結構體默認是私有的,但是可以通過在字段前添加大寫字母來將其變成公有的。當我們想將結構體序列化為 JSON 字符串時,私有字段將不會被編碼進去。但是,有時候我們可能需要在序列化時包含私有字段,這時我們可以使用 Golang 內置的 JSON 標簽。
type Person struct { Name string `json:"name"` // 公有字段 location string `json:"location"` // 私有字段 } person := Person{ Name: "Jack", location: "New York", } jsonBytes, err := json.Marshal(person) if err != nil { log.Fatal(err) } fmt.Println(string(jsonBytes))
如果我們現在運行上面的代碼,我們只會看到 JSON 中的name
字段,而location
字段是不會被編碼的。為了將其也編碼進去,我們需要在結構體中使用 JSON 標簽來告訴編碼器它的 JSON 字段名。
type Person struct { Name string `json:"name"` // 公有字段 location string `json:"location"` // 私有字段 } person := Person{ Name: "Jack", location: "New York", } jsonBytes, err := json.Marshal(struct{ Person }{person}) if err != nil { log.Fatal(err) } fmt.Println(string(jsonBytes))
現在,我們將Person
結構體嵌入了一個無名的結構體中,并將該結構體序列化,這將使私有字段也能被編碼到 JSON 中。
Golang 中的 JSON 標簽還有一些其他的應用場景,比如告訴編碼器如何對字段進行編碼等。有了這些知識,我們能更好地控制 JSON 進行編碼和解碼的過程,更好地應用在我們的項目中。