解析json文件的Go依赖包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/benben_2015/article/details/81119804

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

参考文章

  1. buger/jsonparser

猜你喜欢

转载自blog.csdn.net/benben_2015/article/details/81119804