தொகுதி பாடங்கள் (5/5)
`குறியீடு/json`
encoding/json என்பது Go structs ஐ 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, "", nil, வெற்று ஸ்லைஸ்/வரைபடம்) என்றால் புலத்தைத் தவிர்க்கும்.,-— ஒருபோதும் சீரியல்/டீரியலைஸ் செய்யவில்லை.,string— எண்கள்/பூல்களை சரங்களாக மூடுகிறது (JS ஐடிகளுக்குப் பயன்படும்).
ஸ்ட்ரீம்களுக்கான டிகோடர்/என்கோடர்
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, __AGY2TOK_IN_LINE_LINE_1).
பொதுவான பிழைகள்
- மறத்தல்
&:json.Unmarshal(data, v)எதையும் நிரப்பவில்லை; உங்களுக்கு&vதேவை. - ** பூஜ்ய புலங்களுடன் டிகோடிங் அமைப்பு**: பீதியைத் தவிர்க்க, புலங்களைப் படிக்கும் முன்
errஐச் சரிபார்க்கவும். - பொருந்தாத வகைகள்: ஒரு எண்ணை ஒரு சரமாக மாற்றுவது அல்லது அதற்கு நேர்மாறாக
*json.UnmarshalTypeErrorஐ வழங்கும்.
பயிற்சிகள்
struct u to JSON என்பதை json.Marshal மூலம் வரிசைப்படுத்தி, முடிவை ஒரு சரமாக அச்சிடவும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
json.Unmarshal ஐக் கொண்டு `{"Name":"Ada"}` என்ற கட்டமைப்பை U அமைப்பில் நீக்கி அச்சிடவும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
ஒரு struct இன் புலம் `பெயர் சரம்` (சிறிய எழுத்து) json.Marshal ஆல் சேர்க்கப்பட்டுள்ளதா?
type U struct {
name string
}
b, _ := json.Marshal(U{name: "Ada"})
fmt.Println(string(b))