成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Golang 如何解析和生成json

瀏覽:94日期:2024-05-30 14:57:20

JSON(Javascript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換語(yǔ)言,以文字為基礎(chǔ),具有自我描述性且易于讓人閱讀。盡管JSON是JavaScript的一個(gè)子集,但JSON是獨(dú)立于語(yǔ)言的文本格式,并且采用了類似于C語(yǔ)言家族的一些習(xí)慣。JSON與XML最大的不同在于XML是一個(gè)完整的標(biāo)記語(yǔ)言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及瀏覽器的?冉?燜俳馕鮒С鄭?溝悶涓?視糜諭?縭?荽?淞煊頡?/p>

Golang自帶的JSON解析庫(kù)encoding/json,可以用起將結(jié)構(gòu)化數(shù)據(jù)序列化成json字符串或從json字符串中解析出我們想要的數(shù)據(jù)。

1.解析json

給一個(gè)較為復(fù)雜的json字符串,包含數(shù)組,數(shù)組的元素是json對(duì)象。我們需要取出數(shù)組第一個(gè)元素中的某一個(gè)字段值。其它的解析均可參考下面的代碼。

package mainimport ( '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=%#vn', 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=%Tn',duration,duration)} }} }}

程序輸出:

value=[]interface {}{map[string]interface {}{'picture':'http://qqpublic.qpic.cn/avatar.jpg', 'duration':'839'}}d=839,type=string

解析json字符串時(shí),需要注意如下幾點(diǎn):(1)Go類型和JSON類型的對(duì)應(yīng)關(guān)系如下:

map[string]interface{}代表JSON對(duì)象[]interface{}代表JSON數(shù)組bool代表JSON booleansfloat64代表JSON numbersstring代表JSON stringsnil 代表JSON null

2.生成json

假設(shè)我們有如下一個(gè)類(結(jié)構(gòu)體)student 及其一個(gè)實(shí)例對(duì)象st,將其序列化為json,具體實(shí)現(xiàn)如下:

package mainimport ( '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í)例化一個(gè)數(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失敗時(shí)err!=nil jsonStu, err := json.Marshal(stu) if err != nil { fmt.Println('生成json字符串錯(cuò)誤') } //jsonStu是[]byte類型,轉(zhuǎn)化成string類型便于查看 fmt.Println(string(jsonStu))}

程序輸出結(jié)果:

{'name':'張三','Age':18,'class':{'Name':'1班','Grade':3}}

閱讀以上代碼可以看出:

(1)只要是可導(dǎo)出成員(變量首字母大寫(xiě)),都可以轉(zhuǎn)成json。因成員變量sex是不可導(dǎo)出的,故無(wú)法轉(zhuǎn)成json;

(2)如果變量打上了json標(biāo)簽,如Name旁邊的 json:'name' ,那么轉(zhuǎn)化成的json key就用該標(biāo)簽“name”,否則取字段名作為key,如'Age';

(3)指針變量,編碼時(shí)自動(dòng)轉(zhuǎn)換為它所指向的值,如Class變量;

(4)強(qiáng)調(diào)一句,序列化成功后的json字符串是純粹的字符串。

以上就是Golang 如何解析和生成json的詳細(xì)內(nèi)容,更多關(guān)于golang 解析、生成json的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章: