Golang-Json序列化和反序列化


json 的序列化介紹
    json 序列化是指,將有 key-value 結構的數據類型(比如結構體、map、切片)序列化成 json 字符串的操作。
應用案例
    這里我們介紹一下結構體、map 和切片的序列化,其它數據類型的序列化類似。
package main 
import (
	"fmt"
	"encoding/json"
)
	
//定義一個結構體
type Monster struct {
	Name string 
	Age int 
	Birthday string 
	Sal float64 
	Skill string
}
	
func testStruct() {
	//演示
	monster := Monster{
		Name :"牛魔王", Age : 500,
		Birthday : "2011-11-11",
		Sal : 8000.0,
		Skill : "牛魔拳",
	}
	//將 monster 序列化
	data, err := json.Marshal(&monster) 
	if err != nil {
		fmt.Printf("序列號錯誤 err=%v\n", err)
	}
	//輸出序列化后的結果
	fmt.Printf("monster 序列化后=%v\n", string(data))
	
}
//將 map 進行序列化
func testMap() {
	//定義一個 map
	var a map[string]interface{}
	//使用 map,需要 make
	a = make(map[string]interface{}) a["name"] = "紅孩兒"
	a["age"] = 30
	a["address"] = "洪崖洞"
	
	//將 a 這個 map 進行序列化
	//將 monster 序列化
	data, err := json.Marshal(a) 
	if err != nil {
		fmt.Printf("序列化錯誤 err=%v\n", err)
	}
	//輸出序列化后的結果
	fmt.Printf("a map  序列化后=%v\n", string(data))

}
//演示對切片進行序列化, 我們這個切片 []map[string]interface{} 
func testSlice() {
	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{}
	//使用 map 前,需要先 make
	m2 = make(map[string]interface{})
	m2["name"] = "tom"
	m2["age"] = "20"
	m2["address"] = [2]string{"墨西哥","夏威夷"} 
	slice = append(slice, m2)

	//將切片進行序列化操作
	data, err := json.Marshal(slice) 
	if err != nil {
		fmt.Printf("序列化錯誤 err=%v\n", err)
	}
	//輸出序列化后的結果
	fmt.Printf("slice 序列化后=%v\n", string(data))

}
//對基本數據類型序列化,對基本數據類型進行序列化意義不大
func testFloat64() {
	var num1 float64 = 2345.67

	//對 num1 進行序列化
	data, err := json.Marshal(num1) 
	if err != nil {
		fmt.Printf("序列化錯誤 err=%v\n", err)
	}
	//輸出序列化后的結果
	fmt.Printf("num1 序列化后=%v\n", string(data))
}

func main() {
	//演示將結構體, map , 切片進行序列號
	testStruct() testMap()
	testSlice()//演示對切片的序列化
	testFloat64()//演示對基本數據類型的序列化
}
	

 

注意事項
  對於結構體的序列化,如果我們希望序列化后的key 的名字,又我們自己重新制定,那么可以給struct指定一個 tag 標簽.
  

  序列化后:
  {"monster_name":"牛魔王","monster_age":500,"Birthday":"2011-11-11","Sal":8000,"Skill":"牛魔拳"}

 

json 的反序列化基本介紹

  json 反序列化是指,將 json 字符串反序列化成對應的數據類型(比如結構體、map、切片)的操作
  應用案例
  這里我們介紹一下將 json 字符串反序列化成結構體、map 和切片代碼演示:

package main 
import (
	"fmt" 
	"encoding/json"
)
	
//定義一個結構體
type Monster struct {
	Name string Age int
	Birthday string //....
	Sal float64 Skill string
}
	
//演示將 json 字符串,反序列化成 struct
func unmarshalStruct() {
	//說明 str 在項目開發中,是通過網絡傳輸獲取到.. 或者是讀取文件獲取到
	str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"
	
	//定義一個 Monster 實例
	var monster Monster
	err := json.Unmarshal([]byte(str), &monster) 
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name)
	
}
//演示將 json 字符串,反序列化成 map
func unmarshalMap() {
	str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"紅孩兒\"}"
	
	//定義一個 map
	var a map[string]interface{}
	
	//反序列化
	//注意:反序列化 map,不需要 make,因為 make 操作被封裝到 Unmarshal 函數
	err := json.Unmarshal([]byte(str), &a) 
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 a=%v\n", a)
	
}
//演示將 json 字符串,反序列化成切片
func unmarshalSlice() {
	str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," +
	"{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]"
	
	//定義一個 slice
	var slice []map[string]interface{}
	//反序列化,不需要 make,因為 make 操作被封裝到 Unmarshal 函數
	err := json.Unmarshal([]byte(str), &slice) 
	if err != nil {
		fmt.Printf("unmarshal err=%v\n", err)
	}
	fmt.Printf("反序列化后 slice=%v\n", slice)
}
	
func main() {
	
	unmarshalStruct() 
	unmarshalMap() 
	unmarshalSlice()
}

  對上面代碼的小結說明
  1)在反序列化一個json 字符串時,要確保反序列化后的數據類型和原來序列化前的數據類型一致。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM