Go语言解析Json(使用jsonparser)

原文地址:https://blog.csdn.net/benben_2015/article/details/81119804git

jsonparser  github地址:https://github.com/buger/jsonparsergithub

上一篇golang读取json配置文件介绍了使用encoding/json包来解析json文件,可是这种方法在面对结构复杂、字段较多的状况时,解析效率不是很高。上一篇中,咱们在解析json文件时,须要提早在代码中定义好解析后对应的结构体,比较麻烦。而今天的主角jsonparser不须要你了解载入文件的结构,容许你经过提供它们的路径来访问。它能够快速的提取json内容,比encoding/json包的速度高出10倍左右。 
jsonparser之因此有如此快的速度,缘由有以下几个方面:golang

  • 它不依赖encoding/json,reflection或者interface{},惟一依赖包是bytes;
  • 在字节级别上操做json,提供指向原始数据结构的指针,无内存分配;
  • 没有自动类型转化,默认状况下,全部内容都是字节切片,可是它提供了值类型,所以你能够本身进行转化
  • 它不解析完整的内容,仅仅解析你指定的字段

经过下面的代码来了解下它的使用。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