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
))
}
func main(){
testTruct()
}
输出结果
monster 序列化后
= {"Name":"牛魔王","Age":500,"Sal":1400.5,"Skill":"元气斩"}
map序列化
func testMap(){
var a
map[string]interface{}
a
= make(map[string]interface{})
a
["name"] = "卡卡罗特"
a
["age"] = 45
a
["skill"] = "界王拳"
data
, err
:= json
.Marshal(a
)
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{}
m1
= make(map[string]interface{})
m1
["Fname"] = "jack"
m1
["Lname"] = "ma"
slice
= append(slice
, m1
)
var m2
map[string]interface{}
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
: "牛魔王",
Age
: 500,
Sal
: 1400.50,
Skill
: "元气斩",
}
type Monster
struct{
Name
string `json:"name"`
Age
int
Sal
float64
Skill
string
}
注意:不能直接在struct定义时用 name string 形式,因为json包与当前的main包属于跨包调用,小写name不能跨包使用,序列化时会被丢弃,但不报错,所以只能使用tag形式改名。