我就廢話不多說(shuō)了,大家還是直接看代碼吧~
package main
import (
"encoding/json"
"fmt"
)
type Project struct {
Name string `json:"name"`
Url string `json:"url"`
Docs string `json:"docs,omitempty"`
}
func main() {
p1 := Project{
Name:"hello name",
Url:"https://blog.csdn.net/qq_30505673",
}
data, err := json.Marshal(p1)
if err != nil {
panic(err)
}
// Docs定義為omitempty所以不會(huì)出現(xiàn)Docs的字段
fmt.Printf("%s\n", data)
p2 := Project{
Name:"lovego",
Url:"https://blog.csdn.net/qq_30505673",
Docs:"https://blog.csdn.net/qq_30505673",
}
data2, err := json.Marshal(p2)
if err != nil {
panic(err)
}
//打印出所有的字段
fmt.Printf("%s\n", data2)
}
如果沒有omitempty,該字段是會(huì)顯示的。
補(bǔ)充:golang omitempty實(shí)現(xiàn)嵌套結(jié)構(gòu)體的省略輸出
golang在處理json轉(zhuǎn)換時(shí),對(duì)于標(biāo)簽omitempty定義的field,如果給它賦得值恰好等于空值(比如:false、0、""、nil指針、nil接口、長(zhǎng)度為0的數(shù)組、切片、映射),則在轉(zhuǎn)為json之后不會(huì)輸出這個(gè)field。
那么,針對(duì)結(jié)構(gòu)體中嵌套結(jié)構(gòu)體,如果嵌套結(jié)構(gòu)體為空,是否也會(huì)忽略?如果要忽略空結(jié)構(gòu)體輸出,怎么處理?
情況一:匿名結(jié)構(gòu)體:使用omitempty修飾該匿名結(jié)構(gòu)體中的字段,那么當(dāng)為空時(shí)不會(huì)輸出
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author //匿名結(jié)構(gòu)體
}
type Author struct {
Gender int `json:"gender,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
輸出:
{"name":"testBook","price":0}
情況二:非匿名結(jié)構(gòu)體
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author Author `json:"author,omitempty"`
}
type Author struct {
Gender int `json:"gender,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
輸出:
{"name":"testBook","price":0,"author":{}}
可以發(fā)現(xiàn),沒有給嵌套結(jié)構(gòu)體賦值時(shí),會(huì)打印該嵌套結(jié)構(gòu)體的空結(jié)構(gòu)體。這是因?yàn)樵摽战Y(jié)構(gòu)體不屬于omitempty能識(shí)別的空值(false、0、""、nil指針、nil接口、長(zhǎng)度為0的數(shù)組、切片、映射)。但若期望該嵌套結(jié)構(gòu)體的空結(jié)構(gòu)體也不會(huì)輸出,可以通過(guò)指針實(shí)現(xiàn)。
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author *Author `json:"author,omitempty"`
}
type Author struct {
Gender int `json:"gender"`
Age int `json:"age"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
輸出:
{"name":"testBook","price":0}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- golang json數(shù)組拼接的實(shí)例
- 在golang xorm中使用postgresql的json,array類型的操作
- golang中json小談之字符串轉(zhuǎn)浮點(diǎn)數(shù)的操作
- golang 實(shí)現(xiàn)json類型不確定時(shí)的轉(zhuǎn)換
- golang:json 反序列化的[]和nil操作
- 解決Golang json序列化字符串時(shí)多了\的情況
- golang中json和struct的使用說(shuō)明