最近在使用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,不会编码

转自:https://my.oschina.net/u/4579381/blog/4834739