0%

《Golang》Json 序列化之 Tag

看下面例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"encoding/json"
"fmt"
"log"
)

type Test struct {
A *struct{
AA string `json:"aa"`
} `json:"a,omitempty"`
A1 struct{} `json:"a1,omitempty"`
A2 *uint64 `json:"a2"`
A3 uint64 `json:"a3,omitempty"`
A4 string `json:"a4,omitempty"`
B string `json:"-"`
C uint64 `json:"c,string"`
}

func main() {
test1 := Test{
B: "bb",
C: 346,
A3: 0,
}
b, err := json.Marshal(test1)
if err != nil {
log.Fatal(err)
}
fmt.Println("Marshal", string(b))
}

// Marshal {"a1":{},"a2":null,"c":"346"}
  • json tag 第一个参数是序列化后的 key name,第二个参数控制着序列化的行为
  • 第一个参数如果指定为 -,那么不管字段是否零值,序列化后 json 字符串都不会有这个 key
  • 第二个参数如果是 omitempty,字段为零值时,序列化后 json 字符串将没有这个 key。注意:struct 类型字段不受 omitempty 影响
  • omitempty 只会影响序列化(就是 json 字符串中显不显示这个字段),不影响反序列化
  • 第二个参数如果是 string 等类型声明时,序列化时会尝试转换
  • 不管序列化还是反序列化,json 字符串中的 null 总是对应零值
  • 反序列化时,json 字符串中字段不存在或者值是 null,对应的都是零值



微信关注我,及时接收最新技术文章