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)) }
如果說需要對 json
數(shù)據(jù)進(jìn)行格式化輸出,可以使用 json.MarshalIndent
方法,代碼如下:
MarshalIndent
第一個參數(shù)是要序列化的數(shù)據(jù),第二個參數(shù)是前綴,第三個參數(shù)是縮進(jìn)字符
json.MarshalIndent(mm, "", " ")
序列化結(jié)構(gòu)體
序列化結(jié)構(gòu)體的時候,需要注意以下 2
點:
- 結(jié)構(gòu)體的字段必須是大寫字母開頭,否則無法序列化
- 可以使用
json tag
來指定序列化后的字段名
json tag
使用方式:
json:"name"
表示序列化后的字段名為name
json:"Phone,omitempty"
表示序列化后的字段名為phone
,如果字段值為空,則不序列化- 如果是指針形式的字段
- 字段值為空,則不序列化,例如下面的
Name
字段,不會被序列化,因為指針為nil
- 字段值是空字符串,則序列化,例如下面的
Email
字段,會被序列化,因為指針不為nil
- 字段值為空,則不序列化,例如下面的
type Person struct { Name *string `json:"name,omitempty"` Email *string `json:"email,omitempty"` } email := "" p := Person{ Email: &email, }
json:"age,string"
序列化時可以將數(shù)字變成字符串json:"-"
序列化時忽略該字段
反序列化
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) }
反序列化的時候,需要注意,傳遞空字符串和沒有傳遞字段是沒有區(qū)別的,都會被反序列化,例如上面的 Email
字段,傳遞空字符串和沒有傳遞字段拿到的值都是一個空
如何區(qū)分傳遞空字符串和沒有傳遞字段呢?
需要在定義結(jié)構(gòu)體的時候使用指針類型,例如下面的 Email
字段,如果傳遞空字符串,則 Email
字段的值是一個地址,如果沒有傳遞字段,則 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
是一個 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
是一個 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法
這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關(guān)閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05golang結(jié)構(gòu)體與json格式串實例代碼
本文通過實例代碼給大家介紹了golang結(jié)構(gòu)體與json格式串的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10Go net/http/pprof分析內(nèi)存泄露及解決過程
這篇文章主要介紹了Go net/http/pprof分析內(nèi)存泄露及解決過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04Golang加權(quán)輪詢負(fù)載均衡的實現(xiàn)
負(fù)載均衡器在向后端服務(wù)分發(fā)流量負(fù)載時可以使用幾種策略。本文主要介紹了Golang加權(quán)輪詢負(fù)載均衡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06Golang 如何實現(xiàn)函數(shù)的任意類型傳參
這篇文章主要介紹了Golang 實現(xiàn)函數(shù)的任意類型傳參操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04