json序列化是将有key-val结构的数据类型,序列化成json字符串。
struct序列化
encoding/json
包中的func Marshal(v interface{}) ([]byte, error)
,接收一个空接口,即可以接收任何类型的数据,返回字符切片
package main
import(
"fmt"
"encoding/json"
)
type Monster struct{
Name string
Age int
Sal float64
Skill string
}
func testTruct(){
monster := Monster{
Name : "牛魔王",
Age : 500,
Sal : 1400.50,
Skill : "元气斩",
}
//将结构体序列化
data, err := json.Marshal(&monster)
if err!= nil{
fmt.Printf("序列号错误 err=%v\n",err)
}
fmt.Printf("monster 序列化后 = %v\n",string(data))
//string()将数字切片转换成键值对
}
func main(){
testTruct()
}
输出结果
monster 序列化后 = {"Name":"牛魔王","Age":500,"Sal":1400.5,"Skill":"元气斩"}
map序列化
func testMap(){
//测试map序列化
//map[string]interface{}的意思是value值可以是任意
//类型
var a map[string]interface{}
//使用map需要make
a = make(map[string]interface{})
a["name"] = "卡卡罗特"
a["age"] = 45
a["skill"] = "界王拳"
//也可以a["skill"] = [2]string{"龟派气功", "爆气"}
//回顾数值表示形式
data, err:= json.Marshal(a)
//知识点:map本身就是引用,不用再加&取地址
if err!= nil{
fmt.Printf("序列号错误 err=%v\n",err)
}
fmt.Printf("a map 序列化后 = %v\n",string(data))
}
slice序列化
func testSlice(){
//声明一个切片,切片元素是切片类型
var slice []map[string]interface{}
var m1 map[string]interface{}
//使用map前,现需要make
m1 = make(map[string]interface{})
m1["Fname"] = "jack"
m1["Lname"] = "ma"
slice = append(slice, m1)
//知识点,动态增加slice
var m2 map[string]interface{}
//使用map前,现需要make
m2 = make(map[string]interface{})
m2["Fname"] = "jack"
m2["Lname"] = "chen"
slice = append(slice, m2)
data, err:= json.Marshal(slice)
if err!= nil{
fmt.Printf("序列号错误 err=%v\n",err)
}
fmt.Printf("a map 序列化后 = %v\n",string(data))
}
基本数据类型
对基本数据类型序列化意义不大,序列之后是一个字符串
补充知识
monster := Monster{
Name : "牛魔王", //这边Name是大写,而web浏览器接受
Age : 500, //可能需要小写的name
Sal : 1400.50,
Skill : "元气斩",
}
//解决办法:在定义时可以加一个自定义的tag
type Monster struct{
Name string `json:"name"` //这边用了Golan的反射机制
Age int
Sal float64
Skill string
}
注意:不能直接在struct定义时用 name string
形式,因为json包与当前的main包属于跨包调用,小写name不能跨包使用,序列化时会被丢弃,但不报错,所以只能使用tag形式改名。