结构体和json的相互转换

发布时间 2023-04-03 22:34:26作者: yangphp

前言:

结构体是go中对象操作中用的最多的类型。

json是作为数据交换最方便的类型

两个类型怎么做转换呢?

 

正文:

结构体的命名和成员命名必须遵循第一个字母大写,否则json将结构体或成员作为私有的,进行忽略

 

json库文档:

https://go-zh.org/pkg/encoding/json/

 

func Marshal(v interface{}) ([]byte, error)    //转换为json

func Unmarshal(data []byte, v interface{}) error  //json转换为结构体

 

结构体转换为json示例:

type User struct {

Name  string

Age   int

Email string

}

 

user := User{

Name:  "lampol",

Age:   30,

Email: "4657984@qq.com",

}

jsonByte, _ := json.Marshal(user)   //将结构体转换为json格式
data := string(jsonByte)         //[]byte类型转换为string类型
fmt.Println(data)  //输出:{"Name":"lampol","Age":30,"Email":"4657984@qq.com"}

 

json串转换为结构体示例:

type User struct {

Name  string

Age   int

Email string

}

//json串,转换为结构体

str := `{"Name":"lampol","Age":30,"Email":"4657984@qq.com"}` //注意要使用``包裹起来

var user User

err := json.Unmarshal([]byte(str), &user) 

if err!=nil {  //返回值不会nil表示转换失败

fmt.Println(err.Error())

}

fmt.Println(user) //输出{lampol 30 4657984@qq.com}

fmt.Printf("%T\n", user) //输出类型为: main.User

 

json tag 标签。对结构体的成员名进行重命名

 

定义格式 在成员类型后定义

   Name  string `json:"username"`    //表示将Name json里面的username相对应

   Email   string `json:"-"`      //表示忽略该字段,不参与跟json之间的转换

   Address string `json:"address,omitempty"`  //表示成员值为空则,则忽略,存在则转换

 

type User struct {

   Name  string `json:"username"`   

   Age   int    `json:"age"`

   Email   string `json:"-"`                 //忽略该字段

Address string `json:"address,omitempty"` //如果为空,则忽略

}

使用:

user := User{

Name:  "lampol",

Age:   30,

Email: "4657984@qq.com",

}

 

//结构体转换为json字符串
jsonByte, _ := json.Marshal(user)  //转换为json格式
data := string(jsonByte)
fmt.Println(data)               

//输出:{"username":"lampol","age":30},自动对应

//json字符串转换为结构体
var newUser User
str := `{"username":"lampol","age":30}`
err := json.Unmarshal([]byte(str), &newUser)
if err!=nil {  //返回值不会nil表示转换失败
   fmt.Println(err.Error())
}
fmt.Println(newUser.Name,newUser.Age)     

//输出:lampol 30 ,定义标签后,转换为结构体也是会自动对应
fmt.Printf("%T\n", newUser)          

//输出类型为: main.User