GJSON:Go 高效 JSON 解析利器

3 阅读2分钟

GJSON (github.com/tidwall/gjson) 是一个专注于高效解析和查询 JSON 数据的 Go 语言库。

它的设计目标是提供一种简单、快速的方式来处理 JSON 数据,尤其是在只需要提取部分数据的场景下,它比标准库更加高效。

其作者 Josh Baker 是一位知名的 Go 语言开发者,他是多个流行 Go 库的作者,以其高性能、简洁的开源库而闻名。

核心优势
  • 无需结构体绑定:不需要将整个 JSON 数据解析为 Go 结构体。它允许你只提取你感兴趣的部分数据,从而减少了内存开销。
  • 高效:性能优越,通过直接操作 JSON 字符串来避免不必要的内存分配和复制操作,从而大大提高了性能。尤其是在处理大型 JSON 数据时,性能优势更加明显。
  • 支持路径查询:使用简单的路径表达式获取数据。例如,"user.name" 可以提取 JSON 对象中 user 字段下的 name 字段。
适用场景
  • 快速提取嵌套 JSON 数据中的特定字段
  • 处理动态结构的 JSON 数据,无需提前定义结构体
基本用法

GJSON 提供了一个 Get 函数,用于搜索 JSON 中指定的路径。

package main

import (
 "fmt"
 "github.com/tidwall/gjson"
)

const json = `{
  "code": 200,
  "data":{
    "user": {
      "id": "230011",
      "name""John Doe",
    }
  }
}`

func main() {
 code := gjson.Get(json, "code").Int()
 fmt.Println(code)

 userID := gjson.Get(json, "data.user.id").String()
 fmt.Println(userID)
}

// Output:
// 200
// 230011

此外,GJSON 还提供了 GetBytes 函数,用于处理 JSON 字节切片。

var json []byte = ...
result := gjson.GetBytes(json, path)
路径语法

以下是 path 语法的简单示例。

{
  "name": {"first": "Tom", "last": "Anderson"},
  "age":37,
  "children": ["Sara","Alex","Jack"],
  "fav.movie": "Deer Hunter",
  "friends": [
    {"first": "Dale", "last": "Murphy", "age": 44, "nets": ["ig", "fb", "tw"]},
    {"first": "Roger", "last": "Craig", "age": 68, "nets": ["fb", "tw"]},
    {"first": "Jane", "last": "Murphy", "age": 47, "nets": ["ig", "tw"]}
  ]
}
"name.last"          >> "Anderson"
"age"                >> 37
"children"           >> ["Sara","Alex","Jack"]
"children.#"         >> 3
"children.1"         >> "Alex"
"child*.2"           >> "Jack"
"c?ildren.0"         >> "Sara"
"fav.movie"         >> "Deer Hunter"
"friends.#.first"    >> ["Dale","Roger","Jane"]
"friends.1.last"     >> "Craig"

有关完整的路径语法,请参阅 GJSON 语法文档(github.com/tidwall/gjs…

GJSON 是一个高效、灵活的 JSON 解析库,特别适合在只需要提取部分 JSON 数据的场景下使用。它的高性能和简洁的 API 使得它成为 Go 语言开发者的有力工具。如果你正在寻找一种更高效的 JSON 处理方式,GJSON 绝对值得一试。


References
github.com/tidwall/gjs…