上一篇golang讀取json配置檔案介紹了使用
encoding/json
包來解析json檔案,但是這種方法在面對結構複雜、字段較多的情況時,解析效率不是很高。上一篇中,我們在解析json檔案時,需要提前在代碼中定義好解析後對應的結構體,比較麻煩。而今天的主角
jsonparser
不需要你了解載入檔案的結構,允許你通過提供它們的路徑來通路。它可以快速的提取json内容,比
encoding/json
包的速度高出10倍左右。
jsonparser
之是以有如此快的速度,原因有如下幾個方面:
- 它不依賴
,encoding/json
或者reflection
,唯一依賴包是interface{}
;bytes
- 在位元組級别上操作json,提供指向原始資料結構的指針,無記憶體配置設定;
- 沒有自動類型轉化,預設情況下,所有内容都是位元組切片,但是它提供了值類型,是以你可以自己進行轉化
- 它不解析完整的内容,僅僅解析你指定的字段
通過下面的代碼來了解下它的使用。
package main
import (
"github.com/buger/jsonparser"
"fmt"
)
func main() {
data := []byte(`{
"person": {
"name":{
"first": "Leonid",
"last": "Bugaev",
"fullName": "Leonid Bugaev"
},
"github": {
"handle": "buger",
"followers":
},
"avatars": [
{ "url": "https://avatars1.githubusercontent.com/u/14009?v=3&s=460", "type": "thumbnail" }
]
},
"company": {
"name": "Acme"
}
}`)
result, err := jsonparser.GetString(data, "person", "name", "fullName")
if err != nil {
fmt.Println(err)
}
fmt.Println(result)
content, valueType, offset, err := jsonparser.Get(data, "person", "name", "fullName")
if err != nil {
fmt.Println(err)
}
fmt.Println(content, valueType, offset)
//jsonparser提供了解析bool、string、float64以及int64類型的方法,至于其他類型,我們可以通過valueType類型來自己進行轉化
result1, err := jsonparser.ParseString(content)
if err != nil {
fmt.Println(err)
}
fmt.Println(result1)
err = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
fmt.Printf("key:%s\n value:%s\n Type:%s\n", string(key), string(value), dataType)
return nil
}, "person", "name")
}
參考文章
- buger/jsonparser