首頁 > 軟體

Golang中Json的序列化和反序列化的使用

2022-04-21 16:00:13

 JSON:

  • JSON(JavaScript Object Notation):是一種輕量級的資料交換格式。 它是基於 ECMAScript 規範的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。
  • 簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。易於人閱讀和編寫,同時也易於計算機解析和生成,並有效的 提升網路傳輸效率。
  • Json易於機器解析和生成,並有效的提升網路傳輸效率,通常程式傳輸時會先將資料序列化成json字串,接收方再反序列化成原資料型別
  • 所有的資料型別都可以通過Json表示
  • Json.cn這個網站可以驗證Json格式
  • 序列化用json.Marshal()
  • 反序列化用json.Unmarshal(),反序列化時要和序列化前的資料型別保持一致

建立格式:

基本資料型別序列化:

func testBasic() {
	num := 1.111
	marshal, err := json.Marshal(num)
	if err != nil {
		fmt.Println("json.Marshal err:", err)
	}
	fmt.Println("序列化後:", string(marshal)) // 序列化後: 1.111
}

結構體序列化:

func main() {
	testStudent()
}
/**
type Student struct {
	Name     string
	Age      int
	Birthday string
	Address  string
}
*/
// 如果加上`json:"student_name"`,序列化以後的資料欄位是返回指定格式的,可以小寫,json固定,後面的隨意
type Student struct {
	// 變數首字母大寫才能被解析
	Name     string `json:"student_name"`
	Age      int    `json:"student_age"`
	Birthday string `json:"student_birthday"`
	Address  string `json:"student_address"`
}


func testStudent() {
	student := Student{
		Name:     "itzhuzhu",
		Age:      24,
		Birthday: "1998-01-01",
		Address:  "廣州市天河區",
	}
	marshal, err := json.Marshal(&student)
	if err != nil {
		fmt.Println("json.Marshal err:", err)
	}
	fmt.Println("序列化後:", string(marshal)) // 序列化後:{"Name":"itzhuzhu","Age":24,"Birthday":"1998-01-01","Address":"廣州市天河區"}
}

map序列化:

func testMap() {
	var m map[string]interface{}
	m = make(map[string]interface{})
	m["name"] = "韓信"
	m["age"] = 23
	m["address"] = "廣州"

	marshal, err := json.Marshal(m)
	if err != nil {
		fmt.Println("json.Marshal err:", err)
	}
	fmt.Println("序列化後:", string(marshal)) // 序列化後: {"address":"廣州","age":23,"name":"韓信"}
}

切片序列化:

func testSlice() {
	var slice []map[string]interface{}
	var m map[string]interface{}
	m = make(map[string]interface{})
	m["name"] = "韓信"
	m["age"] = 23
	m["address"] = "廣州"
	slice = append(slice, m)
	marshal, err := json.Marshal(m)
	if err != nil {
		fmt.Println("json.Marshal err:", err)
	}
	fmt.Println("序列化後:", string(marshal)) // 序列化後: {"address":"廣州","age":23,"name":"韓信"}
}

反序列化為結構體:

func deserialize() {
	str := "{"Name":"itzhuzhu","Age":24,"Birthday":"1998-01-01","Address":"廣州市天河區"}"

	// 使用Unmarshal反序列化
	var student Student
	err := json.Unmarshal([]byte(str), &student)
	if err != nil {
		fmt.Println("json.Unmarshal err:", err)
	}

	fmt.Println("反序列化後:", student) // 反序列化後: {itzhuzhu 24 1998-01-01 廣州市天河區}
}

反序列化為map:

func deserializeMap() {
	str := " {"address":"廣州","age":23,"name":"韓信"}"

	// 反序列化的時候不需要make,被封裝到Unmarshal中了
	var m map[string]interface{}

	err := json.Unmarshal([]byte(str), &m)
	if err != nil {
		fmt.Println("json.Unmarshal err:", err)
	}

	fmt.Println("反序列化後:", m) // map[address:廣州 age:23 name:韓信]
}

反序列化為切片:

func deserializeSlice() {
	str := " [{"address":"廣州","age":23,"name":"韓信"}]"

	var slice []map[string]interface{}

	err := json.Unmarshal([]byte(str), &slice)
	if err != nil {
		fmt.Println("json.Unmarshal err:", err)
	}

	fmt.Println("反序列化後:", slice) // 反序列化後: [map[address:廣州 age:23 name:韓信]]
}

到此這篇關於Golang中Json的序列化和反序列化的使用的文章就介紹到這了,更多相關Golang Json序列化和反序列化內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com