Golang 如何解析和生成json
JSON(Javascript Object Notation)是一種輕量級的數(shù)據(jù)交換語言,以文字為基礎(chǔ),具有自我描述性且易于讓人閱讀。盡管JSON是JavaScript的一個子集,但JSON是獨立于語言的文本格式,并且采用了類似于C語言家族的一些習(xí)慣。JSON與XML最大的不同在于XML是一個完整的標(biāo)記語言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及瀏覽器的內(nèi)建快速解析支持,使得其更適用于網(wǎng)絡(luò)數(shù)據(jù)傳輸領(lǐng)域。
Golang自帶的JSON解析庫encoding/json,可以用起將結(jié)構(gòu)化數(shù)據(jù)序列化成json字符串或從json字符串中解析出我們想要的數(shù)據(jù)。
1.解析json
給一個較為復(fù)雜的json字符串,包含數(shù)組,數(shù)組的元素是json對象。我們需要取出數(shù)組第一個元素中的某一個字段值。其它的解析均可參考下面的代碼。
package main import ( "encoding/json" "fmt" ) func main() { jsonStr := []byte(`{"uin":1589276509,"feedID":10000,"videos":[{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}]}`) var jsonMap map[string]interface{} if err := json.Unmarshal(jsonStr, &jsonMap); err!=nil { fmt.Printf("json decode failed, err=%v", err) return } value, ok:=jsonMap["videos"] fmt.Printf("value=%#v\n", value) if ok { sliceValue, ok := value.([]interface{}) if ok { mapValue, ok := sliceValue[0].(map[string]interface{}) if ok { duration, ok := mapValue["duration"] if ok { fmt.Printf("d=%v,type=%T\n",duration,duration) } } } } }
程序輸出:
value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg", "duration":"839"}}
d=839,type=string
解析json字符串時,需要注意如下幾點:
(1)Go類型和JSON類型的對應(yīng)關(guān)系如下:
map[string]interface{}代表JSON對象
[]interface{}代表JSON數(shù)組
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null
2.生成json
假設(shè)我們有如下一個類(結(jié)構(gòu)體)student 及其一個實例對象st,將其序列化為json,具體實現(xiàn)如下:
package main import ( "encoding/json" "fmt" ) type Stu struct { Name string `json:"name"` Age int sex string Class *Class `json:"class"` } type Class struct { Name string Grade int } func main() { //實例化一個數(shù)據(jù)結(jié)構(gòu),用于生成json字符串 stu := Stu{ Name: "張三", Age: 18, sex: "男", } //指針變量 cla := new(Class) cla.Name = "1班" cla.Grade = 3 stu.Class=cla //Marshal失敗時err!=nil jsonStu, err := json.Marshal(stu) if err != nil { fmt.Println("生成json字符串錯誤") } //jsonStu是[]byte類型,轉(zhuǎn)化成string類型便于查看 fmt.Println(string(jsonStu)) }
程序輸出結(jié)果:
{"name":"張三","Age":18,"class":{"Name":"1班","Grade":3}}
閱讀以上代碼可以看出:
(1)只要是可導(dǎo)出成員(變量首字母大寫),都可以轉(zhuǎn)成json。因成員變量sex是不可導(dǎo)出的,故無法轉(zhuǎn)成json;
(2)如果變量打上了json標(biāo)簽,如Name旁邊的 json:"name"
,那么轉(zhuǎn)化成的json key就用該標(biāo)簽“name”,否則取字段名作為key,如"Age";
(3)指針變量,編碼時自動轉(zhuǎn)換為它所指向的值,如Class變量;
(4)強調(diào)一句,序列化成功后的json字符串是純粹的字符串。
以上就是Golang 如何解析和生成json的詳細(xì)內(nèi)容,更多關(guān)于golang 解析、生成json的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang微服務(wù)框架kratos實現(xiàn)Socket.IO服務(wù)的方法
本文主要介紹了golang微服務(wù)框架kratos實現(xiàn)Socket.IO服務(wù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06go語言使用Casbin實現(xiàn)角色的權(quán)限控制
Casbin是用于Golang項目的功能強大且高效的開源訪問控制庫。本文主要介紹了go語言使用Casbin實現(xiàn)角色的權(quán)限控制,感興趣的可以了解下2021-06-06go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例
這篇文章主要為大家介紹了go數(shù)據(jù)結(jié)構(gòu)和算法BitMap原理及實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07