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在開發(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.Student5.切片轉(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:[]uint86.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-05
golang類型轉(zhuǎn)換之interface轉(zhuǎn)字符串string簡(jiǎn)單示例
在我們使用Golang進(jìn)行開發(fā)過(guò)程中,總是繞不開對(duì)字符或字符串的處理,這篇文章主要給大家介紹了關(guān)于golang類型轉(zhuǎn)換之interface轉(zhuǎn)字符串string的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解
這篇文章主要介紹了golang 監(jiān)聽服務(wù)的信號(hào),實(shí)現(xiàn)平滑啟動(dòng),linux信號(hào)說(shuō)明詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解
在開發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下2023-03-03
Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

