Chuyển đến nội dung chính
Mô-đun 5 · Bài học 4 trong tổng số 524/50 trong khóa học~12 min
Bài học theo mô-đun (4/5)

Thẻ trường và JSON

Thẻ trên trường cấu trúc là chuỗi siêu dữ liệu, được đọc qua phản chiếu bởi các thư viện như encoding/json, encoding/xml, trình xác thực, ORM. Họ được viết giữa backticks (chuỗi thô) ngay sau loại trường.

Cú pháp

Go
type User struct {
    Name string `json:"nome"`
    Age  int    `json:"eta,omitempty"`
}

Quy ước định dạng: key:"value" phân tách bằng dấu cách (KHÔNG dấu phẩy) cho nhiều khóa:

Go
type User struct {
    Email string `json:"email" validate:"required,email"`
}

thẻ json: tùy chọn

Tùy chọn phổ biến nhất là json, được sử dụng bởi encoding/json:

Gắn thẻHiệu ứng
json:"nome"Đổi tên trường thành nome trong đầu ra JSON
json:"nome,omitempty"Bỏ qua trường nếu nó ở giá trị 0
json:"-"Không tuần tự hóa/giải tuần tự hóa trường này
json:",omitempty"Giữ tên trường Go nhưng có omitempty
Go
type User struct {
    Name     string `json:"nome"`
    Age      int    `json:"eta,omitempty"`
    Password string `json:"-"`
}

u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b))   // {"nome":"Ada"}

Age bị bỏ qua (giá trị 0 0 + omitempty); Password là bị loại trừ hoàn toàn.

Nguyên soái và Không nguyên soái

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal chỉ chấp nhận một con trỏ vì nó phải ghi vào các trường giá trị.

Các thẻ phổ biến khác

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — sân chơi/trình xác thực
  • form:"..." — liên kết gin / echo

Thư viện đọc chúng thông qua phản ánh (reflect.StructTag.Get("json")): chúng chỉ là những chuỗi cho đến khi có ai đó giải thích chúng.

Hãy thử nó

tập thể dục#go.m5.l4.e1
Nỗ lực: 0Đang tải…

Thêm thẻ json:"nome" vào trường Tên và thẻ json:"eta" vào trường Tuổi.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Thẻ là các chuỗi thô giữa các dấu backticks ngay sau loại trường.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#go.m5.l4.e2
Nỗ lực: 0Đang tải…

Thêm tùy chọn thiếu sót vào trường Tuổi: nó phải được bỏ qua khi nó bằng 0.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Các tùy chọn nằm sau tên, được phân tách bằng dấu phẩy: json:"nome,omitempty".

Giải pháp khả dụng sau 3 lần thử

Quiz#go.m5.l4.e3
Sẵn sàng

Nó in gì với thẻ json:"nome" và json:"eta"?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
Tùy chọn trả lời

Tóm tắt lại

  • Thẻ là các chuỗi thô giữa các dấu backticks: `key:"value" key2:"value2"`.
  • json:"nome": rename. omitempty: omit if zero value. -: exclude.
  • NON-exported (lowercase) fields are ignored by encoding/json.
  • json.Marshal(v) ↔ json.Unmarshal(data, &v) (pointer).
  • Same mechanism for xml, yaml, db, validate, biểu mẫu, …