package main
//serial序列化
import (
"encoding/json"
"fmt"
"log"
)
// 定义一个结构体
type Monster struct {
Name string `json:"name"` //反射机制
/*
对于结构体的序列化,如果我们希望序列化后的key 的名字,又我们自己重新制定,
"Name":"牛魔王","Age":500-->"name":"牛魔王","age":500
那么可以给struct指定一个 tag 标签.
name string(上面的)
name:"牛魔王"(下面的)
直接将Name改成name,在json.Marshal(&monster)中肯定会出差,name丢掉了,因为name小写是私有的
json.Marshal(&monster)是跨包去使用一个不可导出的字段name肯定会出差,丢掉了一个name字段
*/
Age int `json:"age"`
Birthday string
Sal float64
Skill string
}
func testStruct() {
//演示
monster := Monster{
Name: "牛魔王",
Age: 500,
Birthday: "2011-11-11",
Sal: 8000.0,
Skill: "牛魔拳",
}
// func Marshal(v interface{}) ([]byte, error)
// Marshal函数返回v的json编码。
//接收空的接口类型,那也就是说任何一种数据类型都可以让他进行序列化,
//成功返回byte切片,失败返回error
//将monster序列化
//因为接口是引用传递,所以给接口传参也要指针类型,而monster是结构体所以得加地址&
data, err := json.Marshal(&monster)
if err != nil {
log.Fatal(err)
}
//因为data是byte切片,直接输出是看不到内容的,又是看到一堆数字,因此想看到数据得转成数据类型
//注意不加上string(),输出的是一串数字,下面的Map同理
fmt.Printf("monster序列化后=%v\n", string(data))
}
// 将 map 进行序列化
func testMap() {
//定义一个map
//这个map key是字符串,而值是任意接口类型
var a map[string]interface{}
//使用map之前需要make
a = make(map[string]interface{})
a["name"] = "红孩儿"
a["age"] = 300
a["address"] = "洪崖洞"
//map本身是指针类型,按引用方式传送,所以不需要加地址&
//但成功后依旧返回的是byte切片给data
//将 a 这个 map 进行序列化
data, err := json.Marshal(a)
if err != nil {
log.Fatal(err)
}
fmt.Printf("a map类型序列化后=%v\n", string(data))
//输出后的顺序不对,不用理他,随机的
}
// 演示对切片进行序列化, 我们这个切片 []map[string]interface{}
func testSlice() {
//现在这个切片里面有多个map,做的稍微复杂点
var slice []map[string]interface{}
var m1 map[string]interface{}
//使用map之前需要make
m1 = make(map[string]interface{})
m1["name"] = "jack"
m1["age"] = 7
m1["address"] = "北京"
//切片可拼接
slice = append(slice, m1)
var m2 map[string]interface{}
m2 = make(map[string]interface{})
m2["name"] = "tom"
m2["age"] = 6
//注意下面这里的语法
m2["address"] = [2]string{"上海", "深圳"}
slice = append(slice, m2)
//将切片进行序列化操作
data, err := json.Marshal(slice)
if err != nil {
// log.Fatal(err)
fmt.Println("切片序列化错误 err=%v\n", err)
}
// 输 出 序 列 化 后 的 结 果
fmt.Printf("slice 序列化后=%v\n", string(data))
}
// 对基本数据类型序列化,对基本数据类型进行序列化意义不大
func testFloat64() {
var num1 float64 = 2345.6
data, err := json.Marshal(num1)
if err != nil {
log.Fatal(err)
}
//注意末尾是f
fmt.Printf("float64序列后 data=%v\n", string(data))
}
func main() {
//演示将结构体, map , 切片进行序列号
testStruct()
testMap()
testSlice() //演示对切片的序列化
testFloat64() //演示对基本数据类型的序列化
}
2.json.Unmarshal