golang-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":"大錘"}

歡迎大家關注我們的公衆號:知識沉澱部落。
知識沉澱部落

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章