मुख्य सामग्री पर जाएं
मॉड्यूल 5 · पाठ 4 का 5पाठ्यक्रम में 24/50~12 min
मॉड्यूल पाठ (4/5)

फ़ील्ड टैग और JSON

संरचना फ़ील्ड पर टैग मेटाडेटा स्ट्रिंग हैं, जिन्हें प्रतिबिंब के माध्यम से पढ़ा जाता है encoding/json, encoding/xml, सत्यापनकर्ता, ORM जैसे पुस्तकालयों द्वारा। वे फ़ील्ड के प्रकार के ठीक बाद बैकटिक्स (कच्ची स्ट्रिंग) के बीच लिखे जाते हैं।

सिंटेक्स

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

प्रारूप परिपाटी: key:"value" रिक्त स्थान से अलग (नहीं)। अनेक कुंजियों के लिए अल्पविराम:

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

json टैग: विकल्प

सबसे आम विकल्प json है, जिसका उपयोग encoding/json द्वारा किया जाता है:

| टैग | प्रभाव | | ----------------------- | ----------------------------------------------------- | ------ | | json:"nome" | JSON आउटपुट में फ़ील्ड का नाम बदलकर nome कर देता है | | json:"nome,omitempty" | यदि फ़ील्ड अपने शून्य मान पर है तो उसे छोड़ देता है | | json:"-" | इस फ़ील्ड को क्रमबद्ध/डिसेरिएलाइज़ न करें | | json:",omitempty" | गो फ़ील्ड नाम रखता है लेकिन 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" टैग और आयु फ़ील्ड में json:"eta" टैग जोड़ें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

टैग फ़ील्ड प्रकार के ठीक बाद बैकटिक्स के बीच कच्ची स्ट्रिंग हैं।

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: 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, form, ...