原創做者,公衆號【程序員讀書】,歡迎關注公衆號,轉載文章請註明出處哦。前端
在開發應用程序時,客戶端(前端頁面或APP)與服務端交互是在所不免的,在交互過程傳遞數據時,最通用和流行格式即是JSON,Go語言提供了encoding/json包,用於處理JSON數據的編碼與解碼。程序員
除了JSON,XML也經常使用於先後端的數據交互,不過因爲簡潔性、可讀性和流行程度,JSON用得更加普遍。json
JSON全稱爲Javascript Object Notation,一種數據結構化交互的標準協議,易於閱讀與編寫,因此在數據交互時普遍使用。後端
{}
)括起來的一個或多個鍵值對(key/value),用逗號(,)
隔開,最後一個鍵值對後面不能有逗號,鍵必是雙引號(""
)引發來的字符串,而值則但是做意類型(布爾、數字、對象、數組、字符串)。[]
)括號值的集合,這些值但是任意類型(布爾、數字、對象、數組、字符串)。下面的示例,是一個數組中包括兩個對象。數組
[{"id":1,"username":"xiaoming","gender":1,"email":"xiaoming@163.com"},{"id":2,"username":"xiaohong","gender":2,"email":"xiaohong@163.com"}]
複製代碼
使用encoding/json處理JSON編碼與解碼時,就必須處理好JSON數據類型與Go語言數據類型的對應關係。bash
編碼一個結構體時,結構體中只有首字母大寫的成員纔會被編碼,首字母小寫的成員會被忽略,另外,結構體中字段後面容許使用反引號聲明成員的Tag,用於說明成員的元信息。數據結構
type Member struct {
Id int `json:"id"`
Username string `json:"username"`
Sex uint `json:"gender"`
Email string `json:"email"`
}
複製代碼
上面的結構體Member中,咱們定義了四個成員,並聲明瞭每一個成員的Tag信息, 其中Sex的Tag信息聲明爲gender,因此編碼後的結果爲:函數
[{"id":1,"username":"xiaoming","gender":1,"email":"xiaoming@163.com"},{"id":2,"username":"xiaohong","gender":2,"email":"xiaohong@163.com"}]
複製代碼
將Go語言的數據序列化爲JSON字符串的操做,稱爲編碼;編碼後的結果爲一個JSON格式的字符串。ui
使用json.Marshal函數能夠直接編碼任意數據類型。編碼
import (
"encoding/json"
"fmt"
)
func main() {
members := []Member{
{
Id:1,
Username:"小明",
Sex:1,
Email:"xiaoming@163.com",
},
{
Id:2,
Username:"小紅",
Sex:1,
Email:"xiaohong@163.com",
},
{
Id:3,
Username:"小華",
Sex:2,
Email:"xiaohua@163.com",
},
}
data,_ := json.Marshal(members)
fmt.Printf("%s",data)
}
複製代碼
運行結果:
[{"id":1,"username":"小明","gender":1,"email":"xiaoming@163.com"},{"id":2,"username":"小紅","gender":1,"email":"xiaohong@163.com"},{"id":3,"username":"小華","gender":2,"email":"xiaohua@163.com"}]
複製代碼
json.Marshal實際上只是對json.Encoder的封裝,所以使用json.Encoder一樣能夠編碼JSON。
func main(){
b := &bytes.Buffer{}
encoder := json.NewEncoder(b)
err := encoder.Encode(members)
if err != nil{
panic(err)
}
fmt.Println(b.String())
}
複製代碼
將JSON字符串反序列化爲Go相對應類型的做品,稱爲解碼。
json.Unmarshal與json.Marshal函數相反,用於解碼JSON字符串。
func main() {
str := `[
{
"id": 1,
"username": "小明",
"gender": 1,
"email": "xiaoming@163.com"
},
{
"id": 2,
"username": "小紅",
"gender": 1,
"email": "xiaohong@163.com"
},
{
"id": 3,
"username": "小華",
"gender": 2,
"email": "xiaohua@163.com"
}
]`
b := bytes.NewBufferString(str)
var members []Member
err := json.Unmarshal(b.Bytes(),&members)
if err != nil{
panic(err)
}
fmt.Println(members)
}
複製代碼
運行結果:
[{1 小明 1 xiaoming@163.com} {2 小紅 1 xiaohong@163.com} {3 小華 2 xiaohua@163.com}]
複製代碼
func main(){
b := bytes.NewBufferString(str)
var members []Member
decoder := json.NewDecoder(b)
err = decoder.Decode(&members)
if err != nil{
panic(err)
}
fmt.Println(members)
}
複製代碼
Go語言中的encoding/json提供了對JSON數據的編碼與解碼的各類便捷的方法,咱們只要直接使用便完成完成有關JSON的各類處理操做,很是簡單方便。
你的關注,是我寫做路上最大的鼓勵!