本文共 2131 字,大约阅读时间需要 7 分钟。
在使用 Go 语言处理 JSON 数据时,有时我们需要选择如何处理空值。以下是两种常见的方法,结合代码示例和实际使用场景进行说明。
当你希望自动去除空值字段时,可以使用 json:"omitempty" 标志。这是 Go JSON 转换库支持的标志,用于字段默认为空时不被输出。这种方式在大多数情况下非常有用,特别是在与前端或其他系统的数据交互时能显著减少传输的数据量。
package mainimport ( "encoding/json" "fmt")type Person struct { Name string `json:"name,omitempty"` // Name字段为空时不会被序列化 Age int64 `json:"age,omitempty"` // Age字段为空时不会被序列化 Sex int64 `json:"sex,omitempty"` // Sex字段为空时不会被序列化}func main() { var ( per Person b []byte err error ) per = Person{ Name: "", // 设置为默认空值 Age: 15, // 设置非空值 Sex: 1, // 设置非空值 } b, err = json.Marshal(per) if err != nil { fmt.Printf("错误:%v\n", err) return } fmt.Printf("序列化结果:\n%s\n", string(b))} { "age":15,"sex":1 } 可以看到,name 字段因为是空值被剔除了,而 age 和 sex 则被正确序列化。
在某些情况下,你可能不希望 JSON 所生成的内容去除空值。例如,前端传来的数据可能是空字符串,而你希望直接反映这一状态。这种情况下,可以使用指针类型来表示字段是否存在。
package mainimport ( "encoding/json" "fmt" "testing")type Person struct { Name *string `json:"name"` // Name 字段可为空 Age *int64 `json:"age"` // Age 字段可为空 Sex *int64 `json:"sex"` // Sex 字段可为空}func Test_JSON_Empty(t *testing.T) { jsonData := `{"age":12,"name":"xyz","sex":0}` req := Person{ // } err := json.Unmarshal([]byte(jsonData), &req) if err != nil { t.Fatalf("解码失败:%v\n", err) } fmt.Printf("%+v\n", req) if req.Name != nil { fmt.Printf("%s\n", *req.Name) } else { fmt.Printf(" \n") } fmt.Printf("%d\n", *req.Sex)} go test -v
结果如下:
年龄字段非空,所以 req.Age = 12name 字段非空,所以 req.Name = xyz_sex 字段非空,所以 req.Sex = 0
age 字段被设置为 12,所以 rq.age 将非空。name 字段被设置为 "xyz",所以 rq.name 不为 nil。sex 字段被设置为 0,所以 rq.sex 不为 nil。如果在 JSON 数据中 sex 字段不存在(如 {"id":"1234","name":"xyz","age":0}),则 rq.Sex 将为 nil。
null 或空字符串表示为空。此时,使用指针类型可以更直观地反映字段是否存在。通过以上两种方法,你可以灵活地处理 JSON 数据中的空值字段,根据项目需求选择最适合的方案。
转载地址:http://anesz.baihongyu.com/