溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用

發(fā)布時(shí)間:2022-08-17 15:59:35 來(lái)源:億速云 閱讀:161 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

注:本文以Windos系統(tǒng)上Go SDK v1.8進(jìn)行講解

1.JSON介紹

在進(jìn)行前后分離式開發(fā)時(shí),json顯得格外的重要,因?yàn)樗擎溄忧昂笈_(tái)重要的樞紐
json是儲(chǔ)存和交換文本信息的語(yǔ)法,他類似于xml,但是他比xml更加的便捷,快速,易于解析。主要使用場(chǎng)景就是作為前后臺(tái)數(shù)據(jù)交互的樞紐,以下是一個(gè)簡(jiǎn)單json的格式:
JSON: JavaScript Object Notation(JavaScript 對(duì)象標(biāo)記法)。
JSON 是一種存儲(chǔ)和交換數(shù)據(jù)的語(yǔ)法。
JSON 是通過(guò) JavaScript 對(duì)象標(biāo)記法書寫的文本。
當(dāng)數(shù)據(jù)在瀏覽器與服務(wù)器之間進(jìn)行交換時(shí),這些數(shù)據(jù)只能是文本。
JSON 屬于文本,并且我們能夠把任何 JavaScript 對(duì)象轉(zhuǎn)換為 JSON,然后將 JSON 發(fā)送到服務(wù)器。
我們也能把從服務(wù)器接收到的任何 JSON 轉(zhuǎn)換為 JavaScript 對(duì)象。
以這樣的方式,我們能夠把數(shù)據(jù)作為 JavaScript 對(duì)象來(lái)處理,無(wú)需復(fù)雜的解析和轉(zhuǎn)譯。
JSON 使用 JavaScript 語(yǔ)法,但是 JSON 格式是純文本的。
文本可被任何編程語(yǔ)言作為數(shù)據(jù)來(lái)讀取和使用。
JSON 格式最初由 Douglas Crockford 提出。
因?yàn)?JSON 格式僅僅是文本,它能夠輕松地在服務(wù)器瀏覽器之間傳輸,并用作任何編程語(yǔ)言的數(shù)據(jù)格式。
JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時(shí)也易于機(jī)器解析和生成。JSON鍵值對(duì)是用來(lái)保存JS對(duì)象的一種方式,鍵/值對(duì)組合中的鍵名寫在前面并用雙引號(hào)""包裹,使用冒號(hào):分隔,然后緊接著值;多個(gè)鍵值之間使用英文,分隔

2.JSON序列化、反序列化介紹

json的序列化與反序列化介紹:
那么在說(shuō)明如何解析Json和XML之前,我們先來(lái)搞清楚兩個(gè)概念:序列化和反序列化。
序列化,即Serialization,是一個(gè)將對(duì)象的狀態(tài)信息轉(zhuǎn)變?yōu)榭梢源鎯?chǔ)或傳輸?shù)男问降倪^(guò)程。
反序列化,即Deserialization,顧名思義是一個(gè)將可以存儲(chǔ)或傳輸?shù)男蛄修D(zhuǎn)變?yōu)槟硞€(gè)對(duì)象的狀態(tài)信息的過(guò)程。
1.這兩個(gè)過(guò)程互為逆過(guò)程;
2.無(wú)論是序列化還是反序列化,對(duì)象的狀態(tài)信息都與一段序列相對(duì)應(yīng)。

3.encoding/json包介紹

GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用

4.Marshal函數(shù)

GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用

//Student 學(xué)生
type Student struct {
	ID     int
	Gender string
	Name   string
}

//Class 班級(jí)
type Class struct {
	Title    string
	Students []Student
}

//student的構(gòu)造函數(shù)
func newStudent(id int, name string) Student {
	return Student{
		ID:   id,
		Name: name,
	}
}
func main() {
	//創(chuàng)建了一個(gè)班級(jí)變量
	c1 := Class{
		Title:    "101",
		Students: make([]Student, 0, 200),
	}
	//往班級(jí)變量中添加學(xué)生

	for i := 0; i < 10; i++ {
		tmpStu := newStudent(i, fmt.Sprintf("stu%02d,", i))
		c1.Students = append(c1.Students, tmpStu)
	}
	fmt.Println(c1)
	//輸出:{101 [{0  stu00,} {1  stu01,} {2  stu02,} {3  stu03,} {4  stu04,} {5  stu05,} {6  stu06,} {7  stu07,} {8  stu08,} {9  stu09,}]}
	//JSON序列化:結(jié)構(gòu)體轉(zhuǎn)化為JSON格式的字符串
	data, err := json.Marshal(c1)
	if err != nil {
		fmt.Println("json marshal failed")
		return
	}
	fmt.Printf("%T\n", data) //[]uint8
	//fmt.Println(data)//盡量不要采用這樣的方式
	fmt.Println(string(data))
	/*輸出:{"Title":"101","Students":[{"ID":0,"Gender":"","Name":"stu00,"},{"ID":1,"Gender":"","Name":"stu01,"},{"ID":2,"Gender":"","Name":"stu02,"},
	{"ID":3,"Gender":"","Name":"stu03,"},{"ID":4,"Gender":"","Name":"stu04,"},{"ID":5,"Gender":"", "Name":"stu05,"},{"ID":6,"Gender":"","Name":"stu06,"},
	{"ID":7,"Gender":"","Name":"stu07,"},{"ID":8,"Gender":"","Name":"stu08,"},{"ID":9,"Gender":"","Name":"stu09,"}]}*/
}

//大寫例子
package main

import (
	"encoding/json"
	"fmt"
)

//Student 學(xué)生
type Student struct {
	ID     int
	Gender string
	Name   string
}

//Class 班級(jí)
type Class struct {
	title    string
	Students []Student
}

//student的構(gòu)造函數(shù)
func newStudent(id int, name string) Student {
	return Student{
		ID:   id,
		Name: name,
	}
}
func main() {
	//創(chuàng)建了一個(gè)班級(jí)變量
	c1 := Class{
		title:    "101",
		Students: make([]Student, 0, 200),
	}
	//往班級(jí)變量中添加學(xué)生

	for i := 0; i < 10; i++ {
		tmpStu := newStudent(i, fmt.Sprintf("stu%02d,", i))
		c1.Students = append(c1.Students, tmpStu)
	}
	fmt.Println(c1)
	//輸出:{101 [{0  stu00,} {1  stu01,} {2  stu02,} {3  stu03,} {4  stu04,} {5  stu05,} {6  stu06,} {7  stu07,} {8  stu08,} {9  stu09,}]}
	//JSON序列化:結(jié)構(gòu)體轉(zhuǎn)化為JSON格式的字符串
	data, err := json.Marshal(c1)
	if err != nil {
		fmt.Println("json marshal failed")
		return
	}
	fmt.Printf("%T\n", data) //[]uint8
	//fmt.Println(data)//盡量不要采用這樣的方式
	fmt.Println(string(data))
	/*輸出:{"Students":[{"ID":0,"Gender":"","Name":"stu00,"},{"ID":1,"Gender":"","Name":"stu01,"},{"ID":2,"Gender":"","Name":"stu02,"},
	  {"ID":3,"Gender":"","Name":"stu03,"},{"ID":4,"Gender":"","Name":"stu04,"},{"ID":5,"Gender":"", "Name":"stu05,"},{"ID":6,"Gender":"","Name":"stu06,"},
	  {"ID":7,"Gender":"","Name":"stu07,"},{"ID":8,"Gender":"","Name":"stu08,"},{"ID":9,"Gender":"","Name":"stu09,"}]}*/
}

//小寫例子,json包不能看到小寫字段的,所以小寫字段的不會(huì)被序列化

5.Umarshal函數(shù) 

GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用

//Student 學(xué)生
type Student struct {
	ID     int
	Gender string
	Name   string
}
//Class 班級(jí)
type Class struct {
	Title    string
	Students []Student
}
//student的構(gòu)造函數(shù)
func newStudent(id int, name string) Student {
	return Student{
		ID:   id,
		Name: name,
	}
}
func main() {
	//JSON反序列化:JSON格式的字符串轉(zhuǎn)化為結(jié)構(gòu)體
	var c1 Class
	//str的內(nèi)容使用反引號(hào)來(lái)標(biāo)注的``
	str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
	err := json.Unmarshal([]byte(str), &c1) //第二個(gè)參數(shù)用來(lái)存放第一個(gè)參數(shù)的內(nèi)容,c2需要被修改,想要被需改成功必須得傳入指針
	if err != nil {
		fmt.Println("json unmarshal failed!")
		return
	}
	fmt.Println(c1)
	//輸出:{101 [{0 男 stu00} {1 男 stu01} {2 男 stu02} {3 男 stu03} {4 男 stu04} {5 男 stu05} {6 男 stu06} {7 男 stu07} {8 男 stu08} {9 男 stu09}]}
}
//結(jié)構(gòu)體大寫例子
//Student 學(xué)生
type Student struct {
	ID     int
	Gender string
	Name   string
}
//Class 班級(jí)
type Class struct {
	title    string
	Students []Student
}
//student的構(gòu)造函數(shù)
func newStudent(id int, name string) Student {
	return Student{
		ID:   id,
		Name: name,
	}
}
func main() {
	//JSON反序列化:JSON格式的字符串轉(zhuǎn)化為結(jié)構(gòu)體
	var c1 Class
	//str的內(nèi)容使用反引號(hào)來(lái)標(biāo)注的``
	str := `{"title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
	err := json.Unmarshal([]byte(str), &c1) //第二個(gè)參數(shù)用來(lái)存放第一個(gè)參數(shù)的內(nèi)容,c2需要被修改,想要被需改成功必須得傳入指針
	if err != nil {
		fmt.Println("json unmarshal failed!")
		return
	}
	fmt.Println(c1)
	//輸出:{[{0 男 stu00} {1 男 stu01} {2 男 stu02} {3 男 stu03} {4 男 stu04} {5 男 stu05} {6 男 stu06} {7 男 stu07} {8 男 stu08} {9 男 stu09}]}
}
//小寫例子

6.結(jié)構(gòu)體標(biāo)簽Tag

Tag是結(jié)構(gòu)體的元信息,可以在運(yùn)行的時(shí)候通過(guò)反射的機(jī)制讀取出來(lái)。 Tag在結(jié)構(gòu)體字段的后方定義,由一對(duì)反引號(hào)包裹起來(lái),具體的格式如下:
key1:"value1" key2:"value2"
結(jié)構(gòu)體tag由一個(gè)或多個(gè)鍵值對(duì)組成。鍵與值使用冒號(hào)分隔,值用雙引號(hào)括起來(lái)。同一個(gè)結(jié)構(gòu)體字段可以設(shè)置多個(gè)鍵值對(duì)tag,不同的鍵值對(duì)之間使用空格分隔。
注意事項(xiàng): 為結(jié)構(gòu)體編寫Tag時(shí),必須嚴(yán)格遵守鍵值對(duì)的規(guī)則。結(jié)構(gòu)體標(biāo)簽的解析代碼的容錯(cuò)能力很差,一旦格式寫錯(cuò),編譯和運(yùn)行時(shí)都不會(huì)提示任何錯(cuò)誤,通過(guò)反射也無(wú)法正確取值。例如不要在key和value之間添加空格。

關(guān)于“GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“GoLang之標(biāo)準(zhǔn)庫(kù)encoding/json包怎么使用”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI