最近在使用json的时候,发现有一些场景需要对struct tag做一些特殊处理,不然的话,很难去支持。
基于上面的原因,笔者稍微做了整理,算是一些小技巧,希望对你有用,场景如下所示:
场景1: 只希望使用strcut里面的名称,不希望json.Marshal的时候,将struct tag编进去。此时我们应该使用”-“来操作。
场景2: 希望struct里面的名称,在初始化为0,“”, nil的时候,json.Marshal不编码进去。此时我们应该使用“omitempty”来操作。
例子如下所示:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Node struct {
Name string `json:"name"`
Age int `json:"age"`
}
// test里面是我们平时使用最多的方法,指定struct tag
func test() {
n := Node{Name: "Davis", Age: 18}
b, err := json.Marshal(n)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b)
fmt.Print("\n")
}
type Node1 struct {
Name string `json:"name"`
Age int `json:"-"`
}
// test1里面是“-”的使用例子
func test1() {
n := Node1{Name: "Davis", Age: 18}
b, err := json.Marshal(n)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b) // 编码出来看不到age了,
fmt.Print("\n")
fmt.Println("age", n.Age) // 这里的n.Age是可以正常使用的
}
type Node2 struct {
Name string `json:"name"`
Age int `json:"age,omitempty"`
}
// test2是omitempty的使用例子
func test2() {
n := Node2{Name: "Davis", Age: 18}
b, err := json.Marshal(n)
if err != nil {
fmt.Println("error:", err)
}
os.Stdout.Write(b) // Age的数值不是初始化的时候,可以正常编码
fmt.Print("\n")
n.Age = 0 // Age变为0之后,就不会被编码了
b, err = json.Marshal(n)
os.Stdout.Write(b)
fmt.Print("\n")
}
func main() {
test()
fmt.Println("------------")
test1()
fmt.Println("------------")
test2()
}
输出:
{"name":"Davis","age":18}
------------
{"name":"Davis"} // 看不到age
age 18
------------
{"name":"Davis","age":18} // 可以看到age = 18
{"name":"Davis"} // age =0,不会编码