GO·NOTE

一份 Go 开发工程师的学习笔记

0%

转json问题

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*json 问题
1、如何给结构体定义转json的名字
2、如果在转json的时候,去掉某些字段
3、如果在转json的时候,去掉为空的字段
4、在组合结构体中,被组合进去的结构体是否需要写json tag
5、在组合结构体中,想在转json时去掉被组合进去的结构体的json
6、两个结构体a,b都组合了结构体c,想让a,b在转json时展示的c的json字符串不一样,如何做。
*/
package main

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

type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"age"`
Sex bool `json:"sex"`
}

type Student struct {
*Person
Grade string `json:"grade"`
}

type Teacher struct {
*Person `json:"person"` // 如果被组合的结构增加 json tag 则会将其分装成一个json对象,如果想去掉person内的json,则 `json:"-"`
Subject string `json:"subject,omitempty"`
Education string `json:"-"` // 当为 - 时不输出到json
SpouseName string `json:"spouse_name,omitempty"` // omitempty 关键字:字段若为空,则不输出,若有值则是输出 对比 subject
address string `json:"address"` // 字段首字母小写,Unexported field with tag。无法使用 tag,则不输出
// 若想改变Person.name这个 字段为teach_name,则可以把person.name对应的json置为omitempty,并从新为此结构体中的Name
Name string `json:"teach_name"`
}

func main() {
// 组合结构体 json 的输出
s := Student{&Person{"小明", 18, true}, "三年级"}
t := Teacher{&Person{"", 36, false}, "语文", "研究生", "", "龙泽", "老马"}
PrintStructToJson(s, t)
}

func PrintStructToJson(is ...interface{}) {
for _, i := range is {
b, err := json.Marshal(i)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(b))
}
}