在Go語言中,json的序列化和反序列化是非常常用的操作,該操作可以將結構體數據轉化為json格式的字符串,或將json格式的字符串轉化為對應的結構體數據。
在實際開發中,我們可能會碰到一些特殊的需求,比如:需要將數據庫查詢出的結果直接序列化為json格式的字符串,并按照一定的格式顯示出來;或者需要對某些字段進行特殊的處理,等等。此時,就需要進行json的定制化操作。
Go提供了一些內嵌的標準的json定制化選項,比如:omitempty(可以讓空字段在序列化時忽略),string(可以將int類型的數字轉化為string類型),等等。除此之外,還可以自定義MarshalJSON()和UnmarshalJSON()
//自定義json的格式 type User struct { Name string `json:"name"` Age int `json:"age,string"` Score []float64 `json:",omitempty"` } //自定義json的序列化 func (u User) MarshalJSON() ([]byte, error) { temp := struct { Name string `json:"name"` Age string `json:"age"` }{ Name: u.Name, Age: fmt.Sprintf("%d歲", u.Age), } if len(u.Score) >0 { temp.Score = make([]string, len(u.Score)) for i, s := range u.Score { temp.Score[i] = fmt.Sprintf("%.2f分", s) } } return json.Marshal(temp) } //自定義json的反序列化 func (u *User) UnmarshalJSON(data []byte) error { temp := struct { Name string `json:"name"` Age string `json:"age"` Score []string `json:",omitempty"` }{} if err := json.Unmarshal(data, &temp); err != nil { return err } u.Name = temp.Name if age, err := strconv.Atoi(strings.TrimSuffix(temp.Age, "歲")); err == nil { u.Age = age } if len(temp.Score) >0 { u.Score = make([]float64, len(temp.Score)) for i, s := range temp.Score { if score, err := strconv.ParseFloat(strings.TrimSuffix(s, "分"), 64); err == nil { u.Score[i] = score } } } return nil }
通過上述示例代碼,我們可以看出,在Go語言中,json序列化和反序列化的定制操作非常方便,可以根據實際的業務需求進行靈活的選擇和定制。