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

golang自定義json化

吉茹定2年前8瀏覽0評論

在Go語言中,我們可以使用內(nèi)置的json包來將一個結(jié)構(gòu)體對象序列化為JSON格式的字符串,或者將JSON格式的字符串解析為一個結(jié)構(gòu)體對象。但是,如果我們要對JSON數(shù)據(jù)進(jìn)行一些特殊的處理,比如更改屬性名、過濾掉某些屬性等操作,該怎么辦呢?這時候就需要自定義JSON序列化。

type Person struct {
Name  string `json:"name"`
Age   int    `json:"age"`
Title string `json:"title,omitempty"`
}
func (p Person) MarshalJSON() ([]byte, error) {
type Alias Person
return json.Marshal(&struct {
*Alias
LastTitle string `json:"lastTitle"`
}{
Alias:     (*Alias)(&p),
LastTitle: getTitle(),
})
}
func getTitle() string {
return "CEO"
}

以上代碼是一個簡單的Person結(jié)構(gòu)體,我們可以通過給結(jié)構(gòu)體的屬性打上“json”標(biāo)簽來顯式地指定他們在JSON中的屬性名。在MarshalJSON方法中,我們先定義一個類型別名Alias以避免遞歸引用,然后將Person對象轉(zhuǎn)換為一個含有Alias和LastTitle字段的匿名結(jié)構(gòu)體,其中Alias字段再次將其轉(zhuǎn)換為Person類型,而LastTitle字段的值則來自getTitle函數(shù)。這樣我們就可以在序列化的時候?qū)astTitle作為Person對象的一個字段一起輸出了。

調(diào)用MarshalJSON方法:

p := Person{"Tom", 25, ""}
b, err := json.Marshal(p)
if err == nil {
fmt.Println(string(b))
}

上述代碼會將p對象序列化為以下字符串:

{
"name": "Tom",
"age": 25,
"lastTitle": "CEO"
}

這就是自定義JSON序列化的實現(xiàn)方法,我們可以根據(jù)實際需求對結(jié)構(gòu)體進(jìn)行更復(fù)雜的處理來達(dá)到自定義JSON序列化的效果。