Go語(yǔ)言學(xué)習(xí)之JSON編碼解析與使用
1.Map轉(zhuǎn)JSON
package main import ( "encoding/json" "fmt" ) func main() { // map里面 map1 := map[string]string { "name":"張三", "age":"18", "home":"北京", } // 將map解析成json json1, err := json.Marshal(map1) if err != nil { fmt.Println(err.Error()) } fmt.Printf("json1: %s 類型: %T \n",json1,json1) map2 := map[string][]string { "fruit": {"香蕉","葡萄"}, "coder":{"PHP","Go","Java"}, "likes":{"打游戲","看動(dòng)漫"}, } json2, err := json.Marshal(map2) if err != nil { fmt.Println(err.Error()) } fmt.Printf("json2: %s 類型: %T \n",json2,json2) } /**輸出 json1: {"age":"18","home":"北京","name":"張三"} 類型: []uint8 json2: {"coder":["PHP","Go","Java"],"fruit":["香蕉","葡萄"],"likes":["打游戲","看動(dòng)漫"]} 類型: []uint8 */
2. Json轉(zhuǎn)Map
package main import ( "encoding/json" "fmt" ) func main() { json1 := `{"age":"18","home":"北京","name":"張三"}` map1 := make(map[string]string) err := json.Unmarshal([]byte(json1), &map1) if err != nil { fmt.Println(err.Error()) } fmt.Printf("map1: %v T: %T\n",map1,map1) json2 := `{"coder":["PHP","Go","Java"],"fruit":["香蕉","葡萄"],"likes":["打游戲","看動(dòng)漫"]}` map2 := make(map[string][]string) err = json.Unmarshal([]byte(json2), &map2) if err != nil { fmt.Println(err.Error()) } fmt.Printf("map2: %v T: %T\n",map2,map2) } /**輸出 map1: map[age:18 home:北京 name:張三] T: map[string]string map2: map[coder:[PHP Go Java] fruit:[香蕉 葡萄] likes:[打游戲 看動(dòng)漫]] T: map[string][]string */
3.結(jié)構(gòu)體轉(zhuǎn)JSON
3.1 無(wú)字段標(biāo)簽
結(jié)構(gòu)體轉(zhuǎn)換成JSON
在開(kāi)發(fā)中經(jīng)常會(huì)用到。encoding/json
包是通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)編解碼的,<font color=red>因此結(jié)構(gòu)體必須導(dǎo)出所轉(zhuǎn)換的字段,沒(méi)有導(dǎo)出的字段不會(huì)被encoding/json
包解析。</font>
package main import ( "encoding/json" "fmt" ) type Student struct { Name string Age int Class string phone string //小寫字段,則不是會(huì)導(dǎo)出 } func main() { s := Student{ Name: "張三", Age: 17, Class: "三年級(jí)", phone: "17600112222", } json1, err := json.Marshal(s) if err != nil { fmt.Println(err.Error()) } fmt.Printf("json: %s \n",json1) } // 輸出 json: {"Name":"張三","Age":17,"Class":"三年級(jí)"}
3.2 有字段標(biāo)簽
json
包在解析結(jié)構(gòu)體時(shí),如果遇到key
為JSON
的字段標(biāo)簽,則會(huì)按照一定規(guī)則解析該標(biāo)簽。
package main import ( "encoding/json" "fmt" ) // 定義一個(gè)學(xué)生結(jié)構(gòu)體 type Student struct { Name string `json:"_name"` // 字段標(biāo)簽的語(yǔ)法 Age int `json:"_age"` Class string `json:"-"` // 不解析 Phone string `json:"phone"` Score float32 // 沒(méi)有標(biāo)簽時(shí),則用字段名 } func main() { s := Student{ Name: "張三", Age: 17, Class: "三年級(jí)", Phone: "17600112222", Score: 88.5, } json1, err := json.Marshal(s) if err != nil { fmt.Println(err.Error()) } fmt.Printf("json: %s \n",json1) } // 輸出-> json: {"_name":"張三","_age":17,"phone":"17600112222","Score":88.5}
1.規(guī)則總結(jié)
- 有標(biāo)簽名時(shí),標(biāo)簽名會(huì)作為
key
- 沒(méi)有標(biāo)簽時(shí),則會(huì)使用字段名。
- 有標(biāo)簽名時(shí),但是標(biāo)簽名的值為
-
,則不會(huì)導(dǎo)出
3.3 匿名字段
json
包在解析匿名字段時(shí),會(huì)將匿名字段的字段當(dāng)成該結(jié)構(gòu)體的字段處理。
package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"_name"` Age int `json:"_age"` Top // 匿名字段 } type Top struct { Sort int `json:"sort"` Score float64 Class string } func main() { s := Student{ Name: "張三", Age: 18, Top: Top{1,99.5,"一年級(jí)"}, } json1, err := json.Marshal(s) if err != nil { fmt.Println(err.Error()) } fmt.Printf("json: %s \n",json1) } //輸出-> json: {"_name":"張三","_age":18,"sort":1,"Score":99.5,"Class":"一年級(jí)"}
4.JSON轉(zhuǎn)結(jié)構(gòu)體
JSON
可以轉(zhuǎn)換成結(jié)構(gòu)體。同編碼一樣,json
包是通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)解碼的,因此結(jié)構(gòu)體必須導(dǎo)出所轉(zhuǎn)換的字段,不導(dǎo)出的字段不會(huì)被json
包解析。另外解析時(shí)不區(qū)分大小寫。
package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"_name"` Age int `json:"_age"` Top // 匿名字段 } type Top struct { Sort int `json:"sort"` Score float64 Class string } func main(){ student := Student{} js := `{"_name":"張三","_age":18,"sort":1,"Score":99.5,"Class":"一年級(jí)"}` err := json.Unmarshal([]byte(js), &student) if err != nil { fmt.Println(err.Error()) } fmt.Printf("v: %+v t: %T \n",student,student) } // 輸出: v: {Name:張三 Age:18 Top:{Sort:1 Score:99.5 Class:一年級(jí)}} t: main.Student
5.切片轉(zhuǎn)JSON
package main import ( "encoding/json" "fmt" ) func main(){ student := []string { "張三", "李四", "小米", } marshal, err := json.Marshal(student) if err != nil { fmt.Println(err.Error()) } fmt.Printf("v :%s T:%T",marshal,marshal) } // 輸出 v :["張三","李四","小米"] T:[]uint8
6.JSON轉(zhuǎn)切片
package main import ( "encoding/json" "fmt" ) func main(){ json1 := `["張三","李四","小米"]` var sc []string err := json.Unmarshal([]byte(json1), &sc) if err != nil { fmt.Println(err.Error()) } fmt.Printf("v :%v T:%T",sc,sc) } // 輸出: v :[張三 李四 小米] T:[]string
以上就是Go語(yǔ)言學(xué)習(xí)之JSON編碼解析與使用的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言JSON的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Go與Rust高性能解析JSON實(shí)現(xiàn)方法示例
- golang解析json數(shù)據(jù)的4種方法總結(jié)
- Golang解析JSON遇到的坑及解決方法
- Go語(yǔ)言實(shí)現(xiàn)JSON解析的神器詳解
- 一文帶你了解Go語(yǔ)言如何解析JSON
- Go語(yǔ)言JSON解析器gjson使用方法詳解
- Golang實(shí)現(xiàn)解析JSON的三種方法總結(jié)
- golang生成JSON以及解析JSON
- Go?語(yǔ)言?json解析框架與?gjson?詳解
- go語(yǔ)言用八百行代碼實(shí)現(xiàn)一個(gè)JSON解析器
- Go語(yǔ)言實(shí)現(xiàn)JSON解析的方法詳解
- GO中Json解析的幾種方式
相關(guān)文章
Go語(yǔ)言使用GORM操作數(shù)據(jù)庫(kù)使用指南
GORM(全稱為Go?Object?Relational?Mapping)是一個(gè)在Go語(yǔ)言中使用的輕量級(jí)的對(duì)象關(guān)系映射(ORM)庫(kù),本文主要為大家介紹了GORM操作數(shù)據(jù)庫(kù)具體方法,需要的可以參考一下2023-05-05golang類型轉(zhuǎn)換之interface轉(zhuǎn)字符串string簡(jiǎn)單示例
在我們使用Golang進(jìn)行開(kāi)發(fā)過(guò)程中,總是繞不開(kāi)對(duì)字符或字符串的處理,這篇文章主要給大家介紹了關(guān)于golang類型轉(zhuǎn)換之interface轉(zhuǎn)字符串string的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01golang 監(jiān)聽(tīng)服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解
這篇文章主要介紹了golang 監(jiān)聽(tīng)服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12