মডিউল পাঠ (5/5)
`এনকোডিং/জেসন`
encoding/json হল একটি ক্যানোনিকাল প্যাকেজ যা গো স্ট্রাকটগুলিকে JSON এবং পিছনে সিরিয়ালাইজ করার জন্য। এর নিয়মাবলী এবং ত্রুটিগুলি জানা আপনাকে API এবং কনফিগারেশন ফাইলগুলিতে ডিবাগ করার ঘন্টা বাঁচায়।
মার্শাল এবং আনমার্শাল
দুটি প্রধান ফাংশন:
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— নম্বর/বুলগুলিকে স্ট্রিং হিসাবে মোড়ানো হয় (জেএস আইডিগুলির জন্য দরকারী)।
স্ট্রীমের জন্য ডিকোডার/এনকোডার
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))