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ù)進行格式化輸出,可以使用 json.MarshalIndent 方法,代碼如下:
MarshalIndent第一個參數(shù)是要序列化的數(shù)據(jù),第二個參數(shù)是前綴,第三個參數(shù)是縮進字符
json.MarshalIndent(mm, "", " ")
序列化結構體
序列化結構體的時候,需要注意以下 2 點:
- 結構體的字段必須是大寫字母開頭,否則無法序列化
- 可以使用
json tag來指定序列化后的字段名
json tag 使用方式:
json:"name"表示序列化后的字段名為namejson:"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 字符串和結構體指針,代碼如下:
func main() {
j := `{
"name": "uccs",
"age": 18,
"email": "",
"phone": "2222"
}`
var p Person
_ := json.Unmarshal([]byte(j), &p)
fmt.Println(p)
}
反序列化的時候,需要注意,傳遞空字符串和沒有傳遞字段是沒有區(qū)別的,都會被反序列化,例如上面的 Email 字段,傳遞空字符串和沒有傳遞字段拿到的值都是一個空
如何區(qū)分傳遞空字符串和沒有傳遞字段呢?
需要在定義結構體的時候使用指針類型,例如下面的 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 可以直接將結構體寫入文件,并且是以流的方式寫入
func main() {
p := Person{
Name: "xiaoming",
Age: 543251,
}
file, _ := os.Create("person.json")
defer file.Close()
encoder := json.NewEncoder(file)
encoder.SetEscapeHTML(true) // 轉義 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)
}
到此這篇關于go語言中json處理方式詳解的文章就介紹到這了,更多相關go json處理方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
go語言開發(fā)中如何優(yōu)雅得關閉協(xié)程方法
這篇文章主要為大家介紹了go語言開發(fā)中如何優(yōu)雅得關閉協(xié)程方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Golang 如何實現(xiàn)函數(shù)的任意類型傳參
這篇文章主要介紹了Golang 實現(xiàn)函數(shù)的任意類型傳參操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

