package main
import (
"encoding/json"
"fmt"
)
type OrderItem struct {
Id string `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
}
type Order struct { // 需要打上json的tag,不然会转换JSON失败,格式问题!!!
Id string `json:"id"`
// Name string `json:"name,omitempty"` // omitempty表示空就不展示
// Item OrderItem `json:"item"` // 如果使用*标记指针
// Item *OrderItem `json:"item"` // 如果使用*标记指针
Item []OrderItem `json:"item"` // 如果使用切片
// Item []*OrderItem `json:"item"` // 如果使用指针切片
Quantity int `json:"quantity""`
TotalPrice float64 `json:"totalPrice"`
}
// 实体转json
func marshal() {
o := Order{
Id: "1234",
// Name: "snow",
Quantity: 3,
TotalPrice: 30,
// Item: OrderItem{ // 如果上面会用指针,那么使用&进行地址取
// Id: "item_1",
// Name: "snow",
// Price: 15,
// },
// Item: &OrderItem{ // 如果上面会用指针,那么使用&进行地址取
// Id: "item_1",
// Name: "snow",
// Price: 15,
// },
Item: []OrderItem{ // 如果上面会用切片,那么就增加选项
{
Id: "item_1",
Name: "snow",
Price: 15,
},
{
Id: "item_2",
Name: "snow2",
Price: 16,
},
},
// Item: []*OrderItem{ // 如果上面会用指针切片,那么就使用指针标记
// {
// Id: "item_1",
// Name: "snow",
// Price: 15,
// },
// {
// Id: "item_2",
// Name: "snow2",
// Price: 16,
// },
// },
}
// 数据转json
b, err := json.Marshal(o) // 如果定义的数据格式中用写小写,那么是无法转换到json格式的(小写开头非public,不解析)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", b)
// fmt.Printf("%+v\n", o)
}
// json转实体
func unmarshal() {
s := `{"id":"1234","item":[{"id":"item_1","name":"snow","price":15},{"id":"item_2","name":"snow2","price":16}],"quantity":3,"totalPrice":30}`
// 定义好本方法可以查看的内容
var o Order
// 第一个,需要将内容转换成字符数组,直接强转即可;第二个为转换的类型,需要上面定义,然后用地址取传输,不然数据传不回来
err := json.Unmarshal([]byte(s), &o)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", o)
}
func main() {
// 数据转json
marshal()
fmt.Println("换行")
// json转数据
unmarshal()
}