软件开发定制定制golang的json操作

golang的json操作

目录

JSON是一种软件开发定制定制轻量级的数据交换格式。软件开发定制定制易于阅读和编写。 golang 提供了 encoding/json 包来操作JSON数据。

1. 结构体与JSON互转

(1)使用 json.Marshal() 方法,软件开发定制定制把结构体转成 JSON字符串

import (	"encoding/json"	"fmt")type Student struct {	Name string	Age int	Skill string}func main()  {	stu := Student{"tom", 12, "football"}	data, err := json.Marshal(&stu)	if err != nil {		fmt.Printf("软件开发定制定制序列化错误 err=%v\", err)		return	}	fmt.Println("序列化后: ", string(data))}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

打印: 序列化后: {“Name”:“tom”,“Age”:12,“Skill”:“football”}

(2)JSON字符串 转 结构体,可以使用 json.Unmarshal()方法

func main()  {	str := `{"Name":"tom","Age":12,"Skill":"football"}`	var stu2 Student	err := json.Unmarshal([]byte(str), &stu2)	if err != nil {		fmt.Printf("反序列化错误 err=%v\", err)		return	}	fmt.Printf("反序列化后: Student=%v, Name=%v\", stu2, stu2.Name)}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打印: 反序列化后: Student={tom 12 football}, Name=tom

(3)如何实现结构体序列化后key的名称能自定义

对于自定义key的名称,可以给 struct变量指定一个tag标签

type Student struct {	Name string   `json:"stu_name"`	Age int       `json:"stu_age"`	Skill string  // 也可以不指定 tag标签,默认就是 变量名称}func main()  {	stu := Student{"tom", 12, "football"}	data, err := json.Marshal(&stu)	if err != nil {		fmt.Printf("序列化错误 err=%v\", err)		return	}	fmt.Println("序列化后: ", string(data))}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

打印后,可以看到 key的名称已经变成了我们指定的 tag标签 的名称
序列化后: {“stu_name”:“tom”,“stu_age”:12,“Skill”:“football”}

2. map与JSON互转

func main()  {	// map 转 Json字符串	m := make(map[string]interface{})	m["name"] = "jetty"	m["age"] = 16	data, err := json.Marshal(&m)	if err != nil {		fmt.Printf("序列化错误 err=%v\", err)		return	}	fmt.Println("序列化后: ", string(data))    // 打印: 序列化后:  {"age":16,"name":"jetty"}	// Json字符串 转 map	str := `{"age":25,"name":"car"}`	err = json.Unmarshal([]byte(str), &m)	if err != nil {		fmt.Printf("反序列化错误 err=%v\", err)		return	}	fmt.Printf("反序列化后: map=%v, name=%v\", m, m["name"])	// 打印: 反序列化后: map=map[age:25 name:car], name=car}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

3. 结构体的变量不加tag标签能否正常转成json数据

  • 如果变量首字母小写,则为private。因为取不到反射信息,不能转。
  • 如果变量首字母大写,则为public。不管加不加 tag 都能正常转,加了tag的变量就按照tag的名称显示。

示例:

type User struct {	Name string    `json:"u_name"`	age int        `json:"u_age"`	Skill string   // 也可以不指定 tag标签,默认就是 变量名称	addr string}func main()  {	user := User{"admin", 23, "football", "上海"}	data, err := json.Marshal(&user)	if err != nil {		fmt.Printf("序列化错误 err=%v\", err)		return	}	fmt.Println("序列化后: ", string(data))  // 打印: 序列化后:  {"u_name":"admin","Skill":"football"}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

通过打印,我们发现小写的变量,如 age、addr 都没有转成 json数据。

总结:

首字母小写的不管加不加tag都不能转为json数据,而大写的加了tag可以取别名,不加tag则json内的字段跟结构体变量原名一致

4. JSON操作的一些小技巧

(1)忽略掉 struct 指定字段

type User struct {	Name string    `json:"u_name"`	Password string `json:"password"`	Email string `json:"email"`}func main()  {	user := User{"admin", "pwd", "user@163.com"}	person := Person{23, "上海"}	// 忽略掉 Password 字段	data, _ := json.Marshal(struct {		*User		Password string `json:"password,omitempty"`	}{User: &user})	fmt.Println("忽略字段: ", string(data))  // 打印: 忽略字段: {"u_name":"admin","email":"user@163.com"}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

忽略字段: {“u_name”:“admin”,“email”:“user@163.com”}}

(2)添加额外的字段

data, _ = json.Marshal(struct {	*User	Skill string `json:"skill"`  // 临时添加额外的 Skill字段}{	User: &user,	Skill: "football",})fmt.Println("添加额外字段: ", string(data))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

添加额外字段: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“skill”:“football”}

(3)合并两个 struct

type User struct {	Name string    `json:"u_name"`	Password string `json:"password"`	Email string `json:"email"`}type Person struct {	Age int	Addr string `json:"addr"`}func main()  {    // 初始化两个 struct	user := User{"admin", "pwd", "user@163.com"}	person := Person{23, "上海"}		data, _ := json.Marshal(struct {		*User		*Person	}{		User: &user,		Person: &person,	})		fmt.Println("合并两个struct: ", string(data))}
  • 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

合并两个struct: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“Age”:23,“addr”:“上海”}

(4)传递给 int类型

emp := struct {                    // 创建匿名 struct	Num int `json:"num,string"`}{15,}data, _ := json.Marshal(&emp)fmt.Println("数字转成字符串: ", string(data))       // 数字转成字符串: {"num":"15"}str := `{"Num":"25"}`_ = json.Unmarshal([]byte(str), &emp)fmt.Printf("字符串转成数字: Emp.Num=%v\", emp.Num) // 字符串转成数字: Emp.Num=25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

(5)一个 json 分成两个struct

str = ` {"u_name":"system","password":"abc","email":"user2@163.com","Age":23,"addr":"杭州"}`var user2 Uservar person2 Person_ := json.Unmarshal([]byte(str), &struct {	*User	*Person}{	User: &user2,	Person: &person2,})fmt.Printf("分成两个struct: User=%v, Person=%v\", user2, person2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

分成两个struct: User={system abc user2@163.com}, Person={23 杭州}

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发