天天看點

解析json檔案的Go依賴包

上一篇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")
}
           

參考文章

  1. buger/jsonparser