结构体和json的相互转换
前言:
结构体是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
但行好事,莫问前程!
本文来自博客园,作者:yangphp,转载请注明原文链接:https://www.cnblogs.com/ypeih/p/17284717.html