go語言中json處理方式詳解
json 序列化
go 語言中序列化 json 數(shù)據(jù)使用 json.Marshal 方法,代碼如下:
func main() {
mm := map[string]interface{}{
"name": "uccs",
"age": 12,
"extra": map[string]interface{}{
"phone": "12345678910",
},
}
bytes, _ := json.Marshal(mm)
fmt.Println(string(bytes))
}
如果說需要對(duì) json 數(shù)據(jù)進(jìn)行格式化輸出,可以使用 json.MarshalIndent 方法,代碼如下:
MarshalIndent第一個(gè)參數(shù)是要序列化的數(shù)據(jù),第二個(gè)參數(shù)是前綴,第三個(gè)參數(shù)是縮進(jìn)字符
json.MarshalIndent(mm, "", " ")
序列化結(jié)構(gòu)體
序列化結(jié)構(gòu)體的時(shí)候,需要注意以下 2 點(diǎn):
- 結(jié)構(gòu)體的字段必須是大寫字母開頭,否則無法序列化
- 可以使用
json tag來指定序列化后的字段名
json tag 使用方式:
json:"name"表示序列化后的字段名為namejson:"Phone,omitempty"表示序列化后的字段名為phone,如果字段值為空,則不序列化- 如果是指針形式的字段
- 字段值為空,則不序列化,例如下面的
Name字段,不會(huì)被序列化,因?yàn)橹羔槥?nil - 字段值是空字符串,則序列化,例如下面的
Email字段,會(huì)被序列化,因?yàn)橹羔槻粸?nil
- 字段值為空,則不序列化,例如下面的
type Person struct {
Name *string `json:"name,omitempty"`
Email *string `json:"email,omitempty"`
}
email := ""
p := Person{
Email: &email,
}
json:"age,string"序列化時(shí)可以將數(shù)字變成字符串json:"-"序列化時(shí)忽略該字段
反序列化
go 反序列化使用 json.Unmarshal 方法,傳入 json 字符串和結(jié)構(gòu)體指針,代碼如下:
func main() {
j := `{
"name": "uccs",
"age": 18,
"email": "",
"phone": "2222"
}`
var p Person
_ := json.Unmarshal([]byte(j), &p)
fmt.Println(p)
}
反序列化的時(shí)候,需要注意,傳遞空字符串和沒有傳遞字段是沒有區(qū)別的,都會(huì)被反序列化,例如上面的 Email 字段,傳遞空字符串和沒有傳遞字段拿到的值都是一個(gè)空
如何區(qū)分傳遞空字符串和沒有傳遞字段呢?
需要在定義結(jié)構(gòu)體的時(shí)候使用指針類型,例如下面的 Email 字段,如果傳遞空字符串,則 Email 字段的值是一個(gè)地址,如果沒有傳遞字段,則 Email 字段的值是 nil
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Email *string `json:"email"`
Phone string `json:"phone"`
}
j := `{
"name": "uccs",
"age": 18,
"phone": "2222"
}`
k := `{
"name": "uccs",
"age": 18,
"email": "",
"phone": "2222"
}`
var p1 Person
var p2 Person
_ := json.Unmarshal([]byte(j), &p1)
_ := json.Unmarshal([]byte(k), &p2)
fmt.Println(p1) // {uccs 18 <nil> 2222}
fmt.Println(p2) // {uccs 18 0xc000014140 2222}
所以我們可以通過判斷 Email 字段是否為 nil 來區(qū)分傳遞空字符串和沒有傳遞字段
fmt.Println(p1.Email == nil) // Email 是否為 nil 判斷是否傳遞了 Email 字段
encoder
encoder 是一個(gè) Writer 接口,可以用于寫入文件
相比于 file.WriteString(string(bytes)) 方式,encoder 可以直接將結(jié)構(gòu)體寫入文件,并且是以流的方式寫入
func main() {
p := Person{
Name: "xiaoming",
Age: 543251,
}
file, _ := os.Create("person.json")
defer file.Close()
encoder := json.NewEncoder(file)
encoder.SetEscapeHTML(true) // 轉(zhuǎn)義 json 中的特殊字符
encoder.Encode(p)
}
decoder
decoder 是一個(gè) Reader 接口,可以用于讀取文件
decoder 是 encoder 的逆操作,可以從文件中讀取 json 數(shù)據(jù)并且反序列化
func main() {
file, _ := os.Open("person.json")
defer file.Close()
decoder := json.NewDecoder(file)
p := Person{}
decoder.Decode(&p)
fmt.Println(p)
}
到此這篇關(guān)于go語言中json處理方式詳解的文章就介紹到這了,更多相關(guān)go json處理方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法
這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
golang結(jié)構(gòu)體與json格式串實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了golang結(jié)構(gòu)體與json格式串的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
Go net/http/pprof分析內(nèi)存泄露及解決過程
這篇文章主要介紹了Go net/http/pprof分析內(nèi)存泄露及解決過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Golang加權(quán)輪詢負(fù)載均衡的實(shí)現(xiàn)
負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時(shí)可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢負(fù)載均衡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
Golang 如何實(shí)現(xiàn)函數(shù)的任意類型傳參
這篇文章主要介紹了Golang 實(shí)現(xiàn)函數(shù)的任意類型傳參操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04

