欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

go json.marshaler

阮建安1年前8瀏覽0評論

Go語言的json包提供了一種將結構體數據格式化為JSON的方法- json.Marshaler 接口。

在使用json.Marshal函數將數據進行格式化時,如果數據中存在自定義類型,程序會嘗試將自定義類型轉換為默認格式的類型,例如將time.Time類型轉換成RFC 3339 格式字符串。然而,如果存在一些自定義的類型無法被默認轉換或需要我們自己定義格式,json.Marshaler就可以派上用場。

type Person struct {
Name string
Age  int
Gender  gender
Address *Address
}
type gender int
// 實現json.Marshaler接口
func (g gender) MarshalJSON() ([]byte, error) {
switch g {
case male, female:
return []byte(fmt.Sprintf("\"%s\"", g.String())), nil
default:
return nil, fmt.Errorf("invalid gender value %d", g)
}
}
type Address struct {
Province string
City     string
}
// 實現json.Marshaler接口
func (a *Address) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("\"%s,%s\"", a.Province, a.City)), nil
}
const (
male gender = iota
female
)
func main() {
p := Person{
Name:    "Bob",
Age:     28,
Gender:  male,
Address: &Address{"北京市", "北京市"},
}
b, err := json.Marshal(p)
if err != nil {
log.Fatal(err)
}
fmt.Printf("json string: %s\n", string(b))
}

在上面的例子中,我們自定義了gender和Address兩個類型,并在它們中間分別實現了MarshalJSON方法,以便滿足我們的特殊需求。在main函數中,我們創建了一個Person類型的實例并嘗試使用json.Marshal函數將其轉換為JSON。由于Person類型中包含自定義類型gender和Address,當進行格式化時,程序會自動調用它們中的MarshalJSON方法,實現自定義格式化之后,最后輸出的JSON字符串是:

{"Name":"Bob","Age":28,"Gender":"男","Address":"北京市,北京市"}

可以看到,返回的JSON字符串符合我們所期望的格式。