1. 程式人生 > >一個非常棒的Go-Json解析庫

一個非常棒的Go-Json解析庫

json是一種資料格式,經常被用作資料交換,頁面展示,序列化等場景,基本每種語言都有對應的json解析框架,Go語言也不例外,並且內建了json庫,基本能夠滿足一些普通開發場景,但有些複雜場景下就不太理想了,因此找一個好用的開源的json庫就非常有必要了,先放地址 ``` https://github.com/bitly/go-simplejson ``` ####內建json庫的使用 我們建立一個如下結構體,用來測試內建json庫和開源的json庫,一起看看使用上是來怎麼操作的呢? ```go //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的型別時,此時內建庫就不支援了,我們就需要想別的辦法了 ```go 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根據我們的場景來解析這個字串,得到我們想要的結果 ```go s := `{ "tagA" : "json string", "tagB" : 1024, "tagD" : { "tagE":1000 }, "tagF":[ "json array", 1024, {"tagH":"json object"} ] }` ``` 首先我們獲取一個json例項,框架本身支援多種方法獲取一個json實力,可以直接建立,也可以在建立時直接指定一個json字串,也可以通過檔案的形式建立,這裡我們使用使用第二種方式,也就是使用上面程式碼中的json2 ```go json1 := simplejson.New() json2 := simplejson.NewJson(bs [] byte) json3 := simplejson.NewFromReader(r io.Reader) ``` 1、第一個場景,獲取key時tagA的值,下面程式碼中Get方法返回的還是Json例項,想要具體的值,得轉換成值所對應得型別,假設我們已經知道這個值的型別,那麼直接.String()就得到結果了 ```go 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例項直接轉換成值的型別 ```go if json, ok := json2.CheckGet("tagD"); ok { //true ,有該欄位 result,_ := json.String() fmt.Println(ok, result) } ``` 4、第四個場景,獲取巢狀的key,simple-json提供了按照路徑搜尋的方法,也就是一層一層往下查詢,每一層都是一個json例項,如下我們獲取tagE ```go k, err := json2.GetPath("tagD", "tagE").Int64() ``` 5、還有一個其他場景,比如刪除一個key,獲取key的時候返回預設值等 ```go //刪除key是tagA值 json2.Del("tagA") //獲取key是tagC的值,如果不存在,一定返回一個預設的字串,當然也可以返回預設的bool值,int值,等 n := json2.Get("tagC").MustString("default") ``` simple-json的其他更多方法,使用場景大家可以更多地深入研究,歡迎留