目前再前后端传递数据的方式最广泛的引用使用到的就是Json的数据格式;go语言对Json也有一个非常良好的支持
Marshal
生成Json
package main
import (
"encoding/json"
"fmt"
)
type Order struct {
ID string
Name string
Quantity int
TotalPrice float64
}
func main() {
o := Order{
ID: "123456",
Name: "吹风机",
Quantity: 1,
TotalPrice: 45,
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/81a69db70acd4c6c8d78ffd2c99f3469.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
{
"ID": "123456",
"Name": "吹风机",
"Quantity": 1,
"TotalPrice": 45
}
以上输出的Json就可以再网络上进行传输,绝大部分语言都对Json有良好的支持.但是上面的Json所有的字段名都是首字母大写的,再其他语言上是不多见的,我们希望遵循网络上常用的大小写的使用方式
修改首字母大写
package main
import (
"encoding/json"
"fmt"
)
type Order struct {
id string
name string
quantity int
totalPrice float64
}
func main() {
o := Order{
id: "123456",
name: "吹风机",
quantity: 1,
totalPrice: 45,
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/c09ecec3373846e2bedf0379dab17969.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
将字段名改成小写以后,生成的Json是{};主要原因是因为再go语言中,首字母大写的都是public,首字母小写的都是private;我们将首字母改成小写后就全部变成了private;再Marshal时是读不到的
tag
package main
import (
"encoding/json"
"fmt"
)
type Order struct {
ID string `json:"id"`
Name string `json:"name"`
Quantity int `json:"quantity"`
TotalPrice float64 `json:"total_price"`
}
func main() {
o := Order{
ID: "123456",
Name: "吹风机",
Quantity: 1,
TotalPrice: 45,
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/4e0408d8fa3d451881a61a363fa50d61.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
{
"id": "123456",
"name": "吹风机",
"quantity": 1,
"total_price": 45
}
我们再每个属性后面都加上了tag,tag其实是没有什么意义的,它的整个go语言的运行中没有什么意义,只是给json.Marshal看的;如果有tag再生成json的时候会按照tag里面的内容替换成大写的属性名.
空串的处理
不过滤空串
package main
import (
"encoding/json"
"fmt"
)
type Order struct {
ID string `json:"id"`
Name string `json:"name"`
Quantity int `json:"quantity"`
TotalPrice float64 `json:"total_price"`
}
func main() {
o := Order{
ID: "123456",
//Name: "吹风机",
Quantity: 1,
TotalPrice: 45,
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/9cf78fd2016e418395e7f33fe0ecd9a9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
{
"id": "123456",
"name": "",
"quantity": 1,
"total_price": 45
}
我们不对Name进行定义时,生成Json时会生成一个空串,json.Marshal是可以对空串进行过滤的
过滤空串
package main
import (
"encoding/json"
"fmt"
)
type Order struct {
ID string `json:"id"`
Name string `json:"name,omitempty"`
Quantity int `json:"quantity"`
TotalPrice float64 `json:"total_price"`
}
func main() {
o := Order{
ID: "123456",
//Name: "吹风机",
Quantity: 1,
TotalPrice: 45,
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/88f85dc495db4bcea07b4fd9099e931e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
{
"id": "123456",
"quantity": 1,
"total_price": 45
}
我们再tag里面加入omitempty再Marshal时是可以对空串进行过滤的(是否过滤根据实际的应用场景来)
复杂Json的处理
package main
import (
"encoding/json"
"fmt"
)
type OrderItem struct {
ID string `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
}
type UserCoupon struct {
ID string `json:"id"`
Title string `json:"title"`
Used string `json:"used"`
}
type UserGrade struct {
ID string `json:"id"`
GradeNum int `json:"grade_num"`
}
type Order struct {
ID string `json:"id"`
Name string `json:"name,omitempty"`
Quantity int `json:"quantity"`
TotalPrice float64 `json:"total_price"`
Items []OrderItem `json:"items"`
Grade *UserGrade `json:"grade"`
Coupon UserCoupon `json:"coupon"`
}
func main() {
o := Order{
ID: "123456",
Quantity: 1,
TotalPrice: 65,
Items: []OrderItem{
{ID: "123", Name: "吹风机", Price: 45},
{ID: "124", Name: "台灯", Price: 35},
},
Grade: &UserGrade{
ID: "321", GradeNum: 1,
},
Coupon: UserCoupon{
ID: "126",
Title: "满50减15",
Used: "店铺优惠券",
},
}
bytes, err := json.Marshal(o)
if err != nil {
panic(err)
}
fmt.Println(string(bytes))
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/e1f1c3ea3d954d38a3a80cb6405ce71d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
{
"id": "123456",
"quantity": 1,
"total_price": 65,
"items": [
{
"id": "123",
"name": "吹风机",
"price": 45
},
{
"id": "124",
"name": "台灯",
"price": 35
}
],
"grade": {
"id": "321",
"grade_num": 1
},
"coupon": {
"id": "126",
"title": "满50减15",
"used": "店铺优惠券"
}
}
json.Marshal支持对复杂Json的处理.包括但不限于数组,Json的嵌套,指针的使用.
Unmarshal
package main
import (
"encoding/json"
"fmt"
)
type OrderItem struct {
ID string `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
}
type UserCoupon struct {
ID string `json:"id"`
Title string `json:"title"`
Used string `json:"used"`
}
type UserGrade struct {
ID string `json:"id"`
GradeNum int `json:"grade_num"`
}
type Order struct {
ID string `json:"id"`
Name string `json:"name,omitempty"`
Quantity int `json:"quantity"`
TotalPrice float64 `json:"total_price"`
Items []OrderItem `json:"items"`
Grade *UserGrade `json:"grade"`
Coupon UserCoupon `json:"coupon"`
}
func main() {
s := `{"id":"123456","quantity":1,"total_price":65,"items":[{"id":"123","name":"吹风机","price":45},{"id":"124","name":"台灯","price":35}],"grade":{"id":"321","grade_num":1},"coupon":{"id":"126","title":"满50减15","used":"店铺优惠券"}}`
var o Order
err := json.Unmarshal([]byte(s), &o)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n",o)
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/01984a3b3ba845999d65aa0359a26016.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55Wq6IyE54KS6JuLMQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
将Json转换成struct用json.Unmarshal就可以了,go语言对解析Json有同样良好的支持,再解析的时候要注意的是一定要把struct的地址传过去,如果将值传过去,那么就是数据的复制,不会影响到自己定义的struct;只有将地址传过去才能完成 正常的解析