【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
目錄【閱讀時間:約5分鐘】
- 一.概述
- 1.Json的作用
- 2.Go官方 encoding/json 包
- 3. golang json的主要操作
 
- 二.Json Marshal:將數(shù)據(jù)編碼成json字符串
- 三.Json Unmarshal:將json字符串解碼到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)
- 四.myJsonMarshal程序包開發(fā)的踩坑經(jīng)歷
- 1.go doc的第一個坑——函數(shù)名首字母要大寫
- 2.go doc的第二個坑——函數(shù)注釋要在函數(shù)定義前一行,并且注釋開頭應(yīng)為函數(shù)名
 
一.概述
1.Json的作用
Json(Javascript Object Nanotation)是一種數(shù)據(jù)交換格式,常用于前后端數(shù)據(jù)傳輸。任意一端將數(shù)據(jù)轉(zhuǎn)換成json 字符串,另一端再將該字符串解析成相應(yīng)的數(shù)據(jù)結(jié)構(gòu),如string類型,strcut對象等。
2.Go官方 encoding/json 包
Go官方 encoding/json 包 實現(xiàn)了 RFC 4627 中定義的 JSON 的編碼和解碼。JSON 和 Go值之間的映射在 Marshal 和 Unmarshal 函數(shù)的文檔中進(jìn)行了描述。
官方源碼:https://github.com/golang/go/blob/master/src/encoding/json/encode.go
3. golang json的主要操作
根據(jù)上面兩節(jié)的介紹,我們簡單可以將golang json的主要操作分為以下兩種:
①Json Marshal:將數(shù)據(jù)編碼成json字符串
②Json Unmarshal:將json字符串解碼到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)
使用這兩種json操作,可以極大地方便前后端的數(shù)據(jù)傳輸操作。
二.Json Marshal:將數(shù)據(jù)編碼成json字符串
Marshal函數(shù)的作用結(jié)果很直觀,就是將輸入的結(jié)構(gòu)化數(shù)據(jù),轉(zhuǎn)為json字符流并輸出。
 我們可以自定義輸入的數(shù)據(jù)類型以及相應(yīng)的值,并將其轉(zhuǎn)為符合規(guī)則的json字符流。
簡單的使用樣例如下(別忘了"import encoding/json"):
type Stu struct {Name  string `json:"name"`Age   intHIgh  boolsex   stringClass *Class `json:"class"`
}type Class struct {Name  stringGrade int
}func main() {//實例化一個數(shù)據(jù)結(jié)構(gòu),用于生成json字符串stu := Stu{Name: "張三",Age:  18,HIgh: true,sex:  "男",}//指針變量cla := new(Class)cla.Name = "1班"cla.Grade = 3stu.Class=cla//Marshal失敗時err!=niljsonStu, err := json.Marshal(stu)if err != nil {fmt.Println("生成json字符串錯誤")}//jsonStu是[]byte類型,轉(zhuǎn)化成string類型便于查看fmt.Println(string(jsonStu))
}
運行結(jié)果:
{"name":"張三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}
由此可知程序包有如下幾個特性:
 ①結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)為json字符流
 ②支持字段的標(biāo)簽(Tag),標(biāo)簽滿足 json:“你自己的定義”。
 ③指針變量編碼時自動轉(zhuǎn)換為它所指向的值
三.Json Unmarshal:將json字符串解碼到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)
Unmarshal函數(shù)的作用結(jié)果也很直觀,就是將輸入的json字符流,轉(zhuǎn)為相應(yīng)的結(jié)構(gòu)化數(shù)據(jù)并輸出。
 Unmarshal函數(shù)可以看作是Marshal函數(shù)的逆過程,用于json的解碼。
同樣地,展示簡單的使用樣例如下(別忘了"import encoding/json"):
type StuRead struct {Name  interface{} `json:"name"`Age   interface{}HIgh  interface{}sex   interface{}Class interface{} `json:"class"`Test  interface{}
}type Class struct {Name  stringGrade int
}func main() {//json字符中的"引號,需用\進(jìn)行轉(zhuǎn)義,否則編譯出錯//json字符串沿用上面的結(jié)果,但對key進(jìn)行了大小的修改,并添加了sex數(shù)據(jù)data:="{\"name\":\"張三\",\"Age\":18,\"high\":true,\"sex\":\"男\(zhòng)",\"CLASS\":{\"naME\":\"1班\",\"GradE\":3}}"str:=[]byte(data)//1.Unmarshal的第一個參數(shù)是json字符串,第二個參數(shù)是接受json解析的數(shù)據(jù)結(jié)構(gòu)。//第二個參數(shù)必須是指針,否則無法接收解析的數(shù)據(jù),如stu仍為空對象StuRead{}//2.可以直接stu:=new(StuRead),此時的stu自身就是指針stu:=StuRead{}err:=json.Unmarshal(str,&stu)//解析失敗會報錯,如json字符串格式不對,缺"號,缺}等。if err!=nil{fmt.Println(err)}fmt.Println(stu)
}
運行結(jié)果:
{張三 18 true <nil> map[naME:1班 GradE:3] <nil>}
四.myJsonMarshal程序包開發(fā)的踩坑經(jīng)歷
基于Go官方 encoding/json 包,筆者簡單地復(fù)現(xiàn)了其中的Marshal函數(shù),詳情可見基于Golang的對象序列化的程序包開發(fā)——myJsonMarshal。
1.go doc的第一個坑——函數(shù)名首字母要大寫
在進(jìn)行g(shù)o doc輸出API文檔時,筆者發(fā)現(xiàn)有些函數(shù)一直都無法自動生成API、有些函數(shù)能生成API的“詭異現(xiàn)象”,網(wǎng)上搜索也無相關(guān)的資料(吐槽一下go doc的資料也太少了吧!)
經(jīng)過筆者的不斷嘗試,才發(fā)現(xiàn)原來是自己函數(shù)風(fēng)格的問題,在go doc中,如果要通過以下命令生成API文檔:
godoc -url="pkg/github.com/user/myJsonMarshal" > API.html
那么,函數(shù)名首字母必須要大寫。當(dāng)然我們也可以通過以下指令使API文檔強制輸出首字母非大寫的函數(shù):
godoc -u
當(dāng)這種方法并不能生成API文檔,只能在終端上顯示有哪些函數(shù),并且以下指令都是會報錯的:
godoc -u -url="pkg/github.com/user/myJsonMarshal" > API.html
godoc -url="pkg/github.com/user/myJsonMarshal" > API.html -u 
因此,我們還是老老實實地養(yǎng)成函數(shù)名首字母大寫的習(xí)慣吧~
 
2.go doc的第二個坑——函數(shù)注釋要在函數(shù)定義前一行,并且注釋開頭應(yīng)為函數(shù)名
在寫完函數(shù)注釋后,筆者發(fā)現(xiàn)通過go doc生成的API文檔居然沒有顯示相應(yīng)的中文注釋,一開始筆者以為是語言支持等問題而盲目搗鼓了不短的時間,后來才發(fā)現(xiàn)go doc自動生成注釋時,其函數(shù)注釋要在函數(shù)定義前一行,并且注釋開頭應(yīng)為函數(shù)名。
 注釋格式舉例:
//A 是一個樣例函數(shù)
func A {//code
}
總結(jié)
以上是生活随笔為你收集整理的【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于Golang的对象序列化的程序包开发
- 下一篇: 【ReactiveX】基于Golang
