مرکزی مواد پر جائیں
ماڈیول 8 · سبق 5 از 5کورس میں 40/50~14 min
ماڈیول اسباق (5/5)

`انکوڈنگ/json`

encoding/json Go سٹرکٹس کو JSON اور بیک پر سیریلائز کرنے کے لیے کینونیکل پیکیج ہے۔ اس کے کنونشنز اور نقصانات کو جاننا آپ کو APIs اور کنفیگریشن فائلوں پر ڈیبگ کرنے کے گھنٹے بچاتا ہے۔

مارشل اور انمارشل

دو اہم افعال:

Go
data, err := json.Marshal(v)      // Go → []byte JSON
err = json.Unmarshal(data, &v)    // JSON → Go (pass a pointer!)
Go
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 سیریلائز کرتا ہے صرف برآمد شدہ فیلڈز (بڑے)۔ پرائیویٹ فیلڈز کو نظر انداز کر دیا جاتا ہے ** خاموشی سے**:

Go
type U struct {
    Name string // exported → serialized
    age  int    // private → ignored
}

سٹرک ٹیگز: کنٹرولنگ نام اور اختیارات

آؤٹ پٹ میں json:"..." ٹیگز کنٹرول نام، بھول اور اقسام:

Go
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 استعمال کریں:

Go
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 میں ڈی سیریلائز کریں:

Go
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 لوٹاتا ہے۔

مشقیں

ورزش#go.m8.l5.e1
کوششیں: 0لوڈ ہو رہا ہے…

struct u کو JSON میں json.Marshal کے ساتھ سیریلائز کریں اور نتیجہ کو سٹرنگ کے طور پر پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m8.l5.e2
کوششیں: 0لوڈ ہو رہا ہے…

json.Unmarshal کے ساتھ struct U میں `{"Name":"Ada"}` کو ڈی سیریلائز کریں اور اسے پرنٹ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m8.l5.e3
تیار

کیا کسی ڈھانچے کی فیلڈ `نام سٹرنگ` (لوئر کیس) json.Marshal کے ذریعہ شامل ہے؟

Go
type U struct {
  name string
}
b, _ := json.Marshal(U{name: "Ada"})
fmt.Println(string(b))
جواب کے اختیارات