ماڈیول اسباق (5/5)
`انکوڈنگ/json`
encoding/json Go سٹرکٹس کو JSON اور بیک پر سیریلائز کرنے کے لیے کینونیکل پیکیج ہے۔ اس کے کنونشنز اور نقصانات کو جاننا آپ کو APIs اور کنفیگریشن فائلوں پر ڈیبگ کرنے کے گھنٹے بچاتا ہے۔
مارشل اور انمارشل
دو اہم افعال:
data, err := json.Marshal(v) // Go → []byte JSON
err = json.Unmarshal(data, &v) // JSON → Go (pass a pointer!)type User struct {
Name string
Email string
}
u := User{Name: "Ada", Email: "ada@example.com"}
b, _ := json.Marshal(u)
fmt.Println(string(b))
// {"Name":"Ada","Email":"ada@example.com"}
var back User
_ = json.Unmarshal(b, &back)انڈینٹڈ آؤٹ پٹ (انسانی پڑھنے کے قابل) کے لیے json.MarshalIndent(v, "", " ") استعمال کریں۔
صرف برآمد شدہ فیلڈز
json.Marshal سیریلائز کرتا ہے صرف برآمد شدہ فیلڈز (بڑے)۔ پرائیویٹ فیلڈز کو نظر انداز کر دیا جاتا ہے ** خاموشی سے**:
type U struct {
Name string // exported → serialized
age int // private → ignored
}سٹرک ٹیگز: کنٹرولنگ نام اور اختیارات
آؤٹ پٹ میں json:"..." ٹیگز کنٹرول نام، بھول اور اقسام:
type User struct {
Name string `json:"name"` // rename
Email string `json:"email,omitempty"` // omit if zero value
Private string `json:"-"` // never serialized
ID int `json:"id,string"` // number as string
}سب سے زیادہ استعمال شدہ اختیارات:
,omitempty— فیلڈ کو چھوڑ دیتا ہے اگر یہ صفر قدر ہے (0، ""، صفر، خالی ٹکڑا/نقشہ)۔,-— کبھی سیریلائز/ڈی سیریلائز نہیں کیا گیا۔,string— نمبرز/بول کو تار کے طور پر لپیٹتا ہے (JS IDs کے لیے مفید)۔
اسٹریمز کے لیے ڈیکوڈر/انکوڈر
io.Reader/io.Writer (HTTP باڈی، بڑی فائلز) کے ساتھ کام کرتے وقت میموری میں سب کچھ لوڈ کرنے کے بجائے Decoder اور Encoder استعمال کریں:
dec := json.NewDecoder(resp.Body)
var users []User
if err := dec.Decode(&users); err != nil {
return err
}
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
_ = enc.Encode(users)Decoder سٹریمنگ کے لیے dec.Token() کو ٹکڑے ٹکڑے کر کے تجزیہ کرنے کے لیے اور dec.DisallowUnknownFields() کو غیر متوقع کلیدوں کے ساتھ JSON کو مسترد کرنے کے لیے بھی سپورٹ کرتا ہے (ان پٹ کی توثیق کے لیے مفید)۔
عمومی نقشے اور any
اگر آپ اسکیما نہیں جانتے ہیں تو map[string]any میں ڈی سیریلائز کریں:
var v map[string]any
_ = json.Unmarshal(data, &v)
fmt.Println(v["name"])قدروں میں متحرک قسمیں ہوں گی (string، float64 نمبروں کے لئے، []any، map[string]any، bool، nil)۔
عام غلطیاں
- بھولنے سے
&:json.Unmarshal(data, v)کچھ بھی آباد نہیں کرتا ہے۔ آپ کو&vکی ضرورت ہے۔ - نیل فیلڈز کے ساتھ ڈیکوڈنگ اسٹرکٹس: گھبراہٹ سے بچنے کے لیے، فیلڈز پڑھنے سے پہلے
errچیک کریں۔ - غیر موافق قسمیں: کسی نمبر کو سٹرنگ میں ڈی سیریلائز کرنا یا اس کے برعکس
*json.UnmarshalTypeErrorلوٹاتا ہے۔
مشقیں
struct u کو JSON میں json.Marshal کے ساتھ سیریلائز کریں اور نتیجہ کو سٹرنگ کے طور پر پرنٹ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
json.Unmarshal کے ساتھ struct U میں `{"Name":"Ada"}` کو ڈی سیریلائز کریں اور اسے پرنٹ کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔
کیا کسی ڈھانچے کی فیلڈ `نام سٹرنگ` (لوئر کیس) json.Marshal کے ذریعہ شامل ہے؟
type U struct {
name string
}
b, _ := json.Marshal(U{name: "Ada"})
fmt.Println(string(b))