json是一種資料格式,經常被用作資料交換,頁面展示,序列化等場景,基本每種語言都有對應的json解析框架,Go語言也不例外,並且內建了json庫,基本能夠滿足一些普通開發場景,但有些複雜場景下就不太理想了,因此找一個好用的開源的json庫就非常有必要了,先放地址
https://github.com/bitly/go-simplejson
內建json庫的使用
我們建立一個如下結構體,用來測試內建json庫和開源的json庫,一起看看使用上是來怎麼操作的呢?
//omitempty 這個屬性可以在序列化時忽略0值和nil值
// score 不能序列化,屬於私有欄位
type Student struct {
Id int `json:"id"` //如果想json後的id是字串可以這樣寫 `json:"id,string"`
Name string `json:"name"`
Age int `json:"age"`
score map[string]float32 `json:"score"`
Phone string `json:"phone,omitempty"`
Birthday JsonTime `json:"birthday"`
}
內建的json庫基本上就兩個方法 ToJson和FromJson,把一個物件轉換為json字串,把json字串轉化為物件,如下兩個api,如果我們想要從json字串中獲取某個key時,或者想要知道某個value的型別時,此時內建庫就不支援了,我們就需要想別的辦法了
result, err := json.Marshal(v interface{})
err := json.Unmarshal(jsonStr []byte, v interface{})
//序列化
func ToJson(v interface{}) (string, error) {
result, err := json.Marshal(v)
if err != nil {
return "", nil
}
return string(result), nil
}
//反序列化
func FromJson(jsonStr []byte, v interface{}) error {
err := json.Unmarshal(jsonStr, v)
if err != nil {
log.Fatalln(err)
return err
}
return nil
}
simple-json的使用
這個框架使用起來非常簡單,並且原始碼也非常簡潔,只有三個原始碼檔案,三個測試檔案,感興趣的同學可以研究下原始碼實現,simple-json是一個json解析庫,就是說對json字串進行解析,本身不支援序列化和反序列化
我們構造一個json字串,然後使用simple-json根據我們的場景來解析這個字串,得到我們想要的結果
s := `{
"tagA" : "json string",
"tagB" : 1024,
"tagD" : {
"tagE":1000
},
"tagF":[
"json array",
1024,
{"tagH":"json object"}
]
}`
首先我們獲取一個json例項,框架本身支援多種方法獲取一個json實力,可以直接建立,也可以在建立時直接指定一個json字串,也可以通過檔案的形式建立,這裡我們使用使用第二種方式,也就是使用上面程式碼中的json2
json1 := simplejson.New()
json2 := simplejson.NewJson(bs [] byte)
json3 := simplejson.NewFromReader(r io.Reader)
1、第一個場景,獲取key時tagA的值,下面程式碼中Get方法返回的還是Json例項,想要具體的值,得轉換成值所對應得型別,假設我們已經知道這個值的型別,那麼直接.String()就得到結果了
tagAValue ,err := json2.Get("tagA").String()
2、第二個場景, 獲取陣列中的key為tagH的值,首先獲取tagF,返回Json例項,對應的是一個陣列,獲取下標為2的Json例項,再從這個Json例項中獲取key為tagH的value
j,err := json2.Get("tagF").GetIndex(2).Get("tagH").String()
3、第三個場景,檢查某一個key是否存在,第一個反饋的值是json例項,第二個返回的值是bool型別,true代表存在,false代表不存在,如果存在我們可以通過json例項直接轉換成值的型別
if json, ok := json2.CheckGet("tagD"); ok { //true ,有該欄位
result,_ := json.String()
fmt.Println(ok, result)
}
4、第四個場景,獲取巢狀的key,simple-json提供了按照路徑搜尋的方法,也就是一層一層往下查詢,每一層都是一個json例項,如下我們獲取tagE
k, err := json2.GetPath("tagD", "tagE").Int64()
5、還有一個其他場景,比如刪除一個key,獲取key的時候返回預設值等
//刪除key是tagA值
json2.Del("tagA")
//獲取key是tagC的值,如果不存在,一定返回一個預設的字串,當然也可以返回預設的bool值,int值,等
n := json2.Get("tagC").MustString("default")
simple-json的其他更多方法,使用場景大家可以更多地深入研究,歡迎留言探討