色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

go json 序列化定制

錢諍諍2年前10瀏覽0評論

在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序列化和反序列化的定制操作非常方便,可以根據實際的業務需求進行靈活的選擇和定制。