json序列化與反序列化
序列化:指將數據結構或對象狀態轉換成可取用格式(例如存成文件,存於緩衝,或經由網絡中發送),以留待後續在相同或另一臺計算機環境中,能恢復原先狀態的過程。
json序列化:將有 key-value 結構的數據類型(比如結構體、map、切片)序列化成json字符串的操作。
1. 結構體序列化與反序列化
//首先定義一個結構體
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
//對Monster結構體序列化
func MarshalMonster() string{
monster := Monster{
Name:"hahaha",
Age:20,
Birthday:"2020-01-01",
Sal:34.5,
Skill:"大錘",
}
//返回的data數據是一個[]byte
data, err := json.Marshal(&monster)
if err != nil{
fmt.Println("序列化失敗", err)
return
}
fmt.Println("marshal: "string(data))
return string(data)
}
//將結構體反序列化爲對應的struct
func UnmarshalMonster(str string){
var monster Monster
err := json.Unmarshal([]byte(str), &monster)
if err != nil{
fmt.Println("反序列化失敗", err)
return
}
fmt.Println(monster)
}
調用函數輸出結果:
marshal: {"Name":"monster","Age":20,"Birthday":"2020-01-01","Sal":34.5,"Skill":"大錘"}
unmarshal: {monster 20 2020-01-01 34.5 大錘}
2. map序列化與反序列化
//對map序列化
func MarshalMap() string {
var a map[string]interface{}
a = make(map[string]interface{})
a["name"] = "紅孩兒"
a["age"] = 30
a["address"] = "天上"
data, err := json.Marshal(a)
if err != nil{
fmt.Println("序列化失敗", err)
return
}
fmt.Println("marshal: ", string(data))
return string(data)
}
//map反序列化
func UnmarshalMap(str string){
var m map[string]interface{}
err := json.Unmarshal([]byte(str), &m)
if err != nil{
fmt.Println("反序列化失敗", err)
return
}
fmt.Println("unmarshal: ", m)
}
調用函數輸出結果:
marshal: {"address":"天上","age":30,"name":"紅孩兒"}
unmarshal: map[address:天上 age:30 name:紅孩兒]
3. 切片序列化與反序列化
//對切片序列化
func MarshalSlice() string {
var slice []map[string]interface{}
var m1 map[string]interface{}
m1 = make(map[string]interface{})
m1["name"] = "紅孩兒er"
m1["age"] = 32
m1["address"] = "天上a"
slice = append(slice, m1)
var m2 map[string]interface{}
m2 = make(map[string]interface{})
m2["name"] = "紅孩兒er"
m2["age"] = 32
m2["address"] = [2]string{"天上a", "dixia"}
slice = append(slice, m2)
data, err := json.Marshal(slice)
if err != nil{
fmt.Println("序列化失敗", err)
return
}
fmt.Println(string(data))
return string(data)
}
//切片反序列化
func UnmarshalSlice(str string){
var a []map[string]interface{}
err := json.Unmarshal([]byte(str), &a)
if err != nil{
fmt.Println("反序列化失敗", err)
return
}
fmt.Println(a)
}
調用函數輸出結果:
marshal: [{"address":"天上a","age":32,"name":"紅孩兒er"},{"address":["天上a","dixia"],"age":32,"name":"紅孩兒er"}]
unmarshal: [map[address:天上a age:32 name:紅孩兒er] map[address:[天上a dixia] age:32 name:紅孩兒er]]
4. 注意事項
對於結構體類型數據的序列化,如果我們希望序列化後字段有指定的名字,可以通過給struct打tag
標籤實現。
//定義結構體並指定tag標籤
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Birthday string `json:"birthday"`
Sal float64 `json:"sal"`
Skill string `json:"skill"`
}
//對struct序列化
//如果指定tag則會將序列化的key改爲tag的值
func MarshalMonster(){
monster := struct_Monster1{
Name:"hahaha",
Age:20,
Birthday:"2020-01-01",
Sal:34.5,
Skill:"大錘",
}
data, err := json.Marshal(&monster)
if err != nil{
fmt.Println("序列化失敗", err)
return
}
fmt.Println(string(data))
}
調用程序輸出結果:
{"name":"hahaha","age":20,"Birthday":"2020-01-01","Sal":34.5,"Skill":"大錘"}
歡迎大家關注我們的公衆號:知識沉澱部落。