முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 8 · பாடம் 5 இன் 5பாடத்திட்டத்தில் 40/50~14 min
தொகுதி பாடங்கள் (5/5)

`குறியீடு/json`

encoding/json என்பது Go structs ஐ JSON மற்றும் பின்னுக்குத் தொடர்வதற்கான நியமன தொகுப்பு ஆகும். அதன் மரபுகள் மற்றும் ஆபத்துக்களை அறிந்துகொள்வது, APIகள் மற்றும் உள்ளமைவு கோப்புகளில் பிழைத்திருத்தத்தை மணிநேரம் சேமிக்கிறது.

மார்ஷல் மற்றும் அன்மார்ஷல்

இரண்டு முக்கிய செயல்பாடுகள்:

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, "", nil, வெற்று ஸ்லைஸ்/வரைபடம்) என்றால் புலத்தைத் தவிர்க்கும்.
  • ,- — ஒருபோதும் சீரியல்/டீரியலைஸ் செய்யவில்லை.
  • ,string — எண்கள்/பூல்களை சரங்களாக மூடுகிறது (JS ஐடிகளுக்குப் பயன்படும்).

ஸ்ட்ரீம்களுக்கான டிகோடர்/என்கோடர்

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, __AGY2TOK_IN_LINE_LINE_1).

பொதுவான பிழைகள்

  • மறத்தல் &: json.Unmarshal(data, v) எதையும் நிரப்பவில்லை; உங்களுக்கு &v தேவை.
  • ** பூஜ்ய புலங்களுடன் டிகோடிங் அமைப்பு**: பீதியைத் தவிர்க்க, புலங்களைப் படிக்கும் முன் err ஐச் சரிபார்க்கவும்.
  • பொருந்தாத வகைகள்: ஒரு எண்ணை ஒரு சரமாக மாற்றுவது அல்லது அதற்கு நேர்மாறாக *json.UnmarshalTypeErrorஐ வழங்கும்.

பயிற்சிகள்

உடற்பயிற்சி#go.m8.l5.e1
முயற்சிகள்: 0ஏற்றுகிறது…

struct u to JSON என்பதை json.Marshal மூலம் வரிசைப்படுத்தி, முடிவை ஒரு சரமாக அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

உடற்பயிற்சி#go.m8.l5.e2
முயற்சிகள்: 0ஏற்றுகிறது…

json.Unmarshal ஐக் கொண்டு `{"Name":"Ada"}` என்ற கட்டமைப்பை U அமைப்பில் நீக்கி அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

Quiz#go.m8.l5.e3
தயார்

ஒரு struct இன் புலம் `பெயர் சரம்` (சிறிய எழுத்து) json.Marshal ஆல் சேர்க்கப்பட்டுள்ளதா?

Go
type U struct {
  name string
}
b, _ := json.Marshal(U{name: "Ada"})
fmt.Println(string(b))
பதில் விருப்பங்கள்