דילוג לתוכן המרכזי
מודול 5 · שיעור 4 מתוך 524/50 בקורס~12 min
שיעורי מודול (4/5)

תגי שדה ו-JSON

תגיות בשדות struct הם מחרוזות מטא נתונים, הנקראות באמצעות השתקפות על ידי ספריות כמו encoding/json, encoding/xml, מאמתים, ORMs. הם נכתבים בין הסמסים (מחרוזת גולמית) מיד אחרי סוג השדה.

תַחבִּיר

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

מוסכמות עיצוב: key:"value" מופרדים ברווחים (NOT פסיקים) עבור מספר מפתחות:

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

תג json: אפשרויות

האפשרות הנפוצה ביותר היא json, בשימוש על ידי encoding/json:

תגאפקט
json:"nome"משנה את שם השדה ל-nome בפלט JSON
json:"nome,omitempty"משמיט את השדה אם הוא בערך האפס שלו
json:"-"אל תעשה שדה זה בסידרה/דה-סריאל
json:",omitempty"שומר את שם השדה Go אבל עם 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 מושמט (ערך אפס 0 + omitempty); Password הוא לא נכלל לחלוטין.

מרשל ואנמרשל

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

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

Unmarshal מקבל רק מצביע, מכיוון שהוא חייב לכתוב ב- השדות של הערך.

תגים נפוצים אחרים

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." - מגרש משחקים/תיקוף
  • form:"..." - כריכת ג'ין / אקו

ספריות קוראים אותן באמצעות השתקפות (reflect.StructTag.Get("json")): הם רק מחרוזות עד שמישהו יפרש אותם.

נסה את זה

פעילות גופנית#go.m5.l4.e1
ניסיונות: 0טוען...

הוסף את התג json:"nome" לשדה Name ואת התג json:"eta" לשדה Age.

טוען עורך...
הצג רמז

תגיות הן מחרוזות גולמיות בין סימנים לאחורים מיד אחרי סוג השדה.

הפתרון זמין לאחר 3 ניסיונות

פעילות גופנית#go.m5.l4.e2
ניסיונות: 0טוען...

הוסף את אפשרות השמטה לשדה גיל: יש להשמיט אותה כאשר היא 0.

טוען עורך...
הצג רמז

האפשרויות באות אחרי השם, מופרדות בפסיק: json:"nome,omitempty".

הפתרון זמין לאחר 3 ניסיונות

Quiz#go.m5.l4.e3
מוכן

מה זה מדפיס עם התגים json:"nome" ו-json:"eta"?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
אפשרויות תשובה

לְסַכֵּם

  • תגים הם מחרוזות גולמיות בין סימנים לאחור: `key:"value" key2:"value2"`.
  • json:"nome": rename. omitempty__PROTECTED_INLINE_ 28__-: 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, form, …