原文地址:https://blog.csdn.net/benben_2015/article/details/81119804
jsonparser github地址:https://github.com/buger/jsonparser
上一篇golang读取json配置文件介绍了使用encoding/json
包来解析json文件,但是这种方法在面对结构复杂、字段较多的情况时,解析效率不是很高。上一篇中,我们在解析json文件时,需要提前在代码中定义好解析后对应的结构体,比较麻烦。而今天的主角jsonparser
不需要你了解载入文件的结构,允许你通过提供它们的路径来访问。它可以快速的提取json内容,比encoding/json
包的速度高出10倍左右。 jsonparser
之所以有如此快的速度,原因有如下几个方面:
encoding/json
,reflection
或者interface{}
,唯一依赖包是bytes
;通过下面的代码来了解下它的使用。
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": 109
},
"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")
}
参考文章