在Go語言中,我們常常需要將結構體(struct)實例序列化成json字元串,在這個過程中,有些欄位可能並不想要被序列化成json字元串,畢竟有些欄位並不是必須的,在這個時候,gojsonomitempty這個標記就派上了用場。
一、gojsonomitempty是什麼?
gojsonomitempty是Golang官方在json序列化方面提供的解決方案,主要解決了序列化的零值問題,該標記可以被用在結構體欄位上,以達到序列化的時候,忽略掉那些零值或者是空值的效果。在json序列化時,如果一個欄位的值為空,那麼該欄位不會被序列化。在struct實例中,如果一個欄位的值為該類型零值,那麼該欄位不會被序列化。
如果沒有gojsonomitempty標記,我們通過json.Marshal方法將結構體實例序列化成json字元串時,序列化器會將結構體中的所有欄位都序列化出來,即使這些欄位的值為零值或者是空值。而當欄位被標記上該標記後,序列化器就會忽略該欄位。
二、gojsonomitempty標記的語法
gojsonomitempty標記是在欄位的json tag中設置的,用逗號分隔,具體語法如下:
type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Address string `json:"address,omitempty"` }
上面是一個Person類型的結構體,其中Age和Address欄位都有標記。在標記中,omitempty表示在序列化時忽略空值欄位。如果Age,默認將被序列化,並且即使Age值為0或防止的零值,意味著”-“或不帶任何選項內容,將不會刪除該欄位。
三、gojsonomitempty的使用示例
下面的代碼示例演示了gojsonomitempty標記在結構體序列化中的使用:
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age,omitempty"` Address string `json:"address,omitempty"` } func main() { p1 := Person{ Name: "Mike", Age: 0, Address: "", } p2 := Person{ Name: "Mike", Age: 18, Address: "", } b1, _ := json.Marshal(p1) fmt.Println(string(b1)) // 輸出:{"name":"Mike"} b2, _ := json.Marshal(p2) fmt.Println(string(b2)) // 輸出:{"name":"Mike","age":18} }
在上面的代碼示例中,我們定義了Person類型的結構體,並在標記中加上了gojsonomitempty標記。在main函數中,我們初始化了兩個結構體實例:p1和p2。在序列化p1時,由於其Age和Address欄位都為空值,因此輸出結果只包含Name欄位;而在序列化p2時,由於Age欄位的值不為空,因此輸出結果中包含了Name和Age欄位。
四、gojsonomitempty的注意事項
需要注意的是,gojsonomitempty標記只對nil指針,零值(如false、0、””等)或長度為0的切片、map、指針、介面和數組有效,而對於長度為0的字元串,標記不起作用,空字元串仍將被序列化。
此外,在一些特定的場景下,gojsonomitempty標記可能會對程序產生意想不到的影響,特別是在使用指針時,d一定要注意指針所指向的內存是否被其他變數引用。
總結
在結構體序列化成json字元串時,一些欄位值為空或者是零值可能是沒有必要的,但如果沒有進行處理,會浪費網路帶寬和磁碟空間。而使用gojsonomitempty標記則可以很好的解決這個問題。
通過對gojsonomitempty的認識,我們可以更加地靈活和高效地應對結構體序列化的問題,提升程序的性能和效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/156618.html