go的json序列化,以及tag使用

json 序列化

package main

import (
	"encoding/json"
	"fmt"
)


type User struct {
	UserName string  `json:"姓名"` // 有了tag,序列化出来的就是tag中的名字
	Sex string   `json:"性别"`
	Score float32  // 没有设置tag默认是自己的
	age int32 // 小写的是私有的, 其他包不可以访问,json序列化时会自动把这个给忽略<details>
}

func test(){
	user := &User{
		UserName:"user01",
		Sex:"男",
		Score:99.5,
		age: 23,  // 小写的不会序列化进入json的函数中
	}
	data,_ := json.Marshal(user)
	fmt.Printf("bytes str:%v\n",data)
	fmt.Printf("json str:%s\n",string(data))
}

func main(){
	test()
}

输出:

bytes str:[123 34 229 167 147 229 144 141 34 58 34 117 115 101 114 48 49 34 44 34 230 128 167 229 136 171 34 58 34 231 148 183 34 44 34 83 99 111 114 101 34 58 57 57 46 53 125]
json str:{"姓名":"user01","性别":"男","Score":99.5}

思考问题:
为什么序列化后,key-val的key值是结构体Tag的值,而不是字段的名称,比如:不是UserName而是: "姓名”:”user01”
引出反射:(note:学习reflect后,回头来解决)

tag使用:

package main

import (
	"fmt"
	"reflect"
)

//type Tag struct {
//	field1 bool   `name:"first field" id:"1"`
//}

type Tag struct {
	field1 bool   `name:"first field" id:"1"`
	field2 string `name:"second field" id:"2"`
	field3 int    `name:"third field" id:"3"`
}

func main() {
	tag := Tag{
		field1: false,
		field2: "Bob",
		field3: 99}
	t := reflect.TypeOf(tag)
	fmt.Println("00>> ", t.Field(0).Tag)
	fmt.Println("01>> ", t.Field(1).Tag)
	fmt.Println("02>> ", t.Field(2).Tag)
	fmt.Println("03>> ", t.Field(0).Tag.Get("name"),t.Field(0).Tag.Get("id"))
	fmt.Println("04>> ", t.Field(1).Tag.Get("name"),t.Field(0).Tag.Get("id"))
	fmt.Println("05>> ", t.Field(2).Tag.Get("name"),t.Field(0).Tag.Get("id"))
}

输出:

00>>  name:"first field" id:"1"
01>>  name:"second field" id:"2"
02>>  name:"third field" id:"3"
03>>  first field 1
04>>  second field 1
05>>  third field 1
posted @ 2022-03-06 23:27  ty1539  阅读(259)  评论(0编辑  收藏  举报