当前位置: 首页 > article >正文

【gjson使用方法】

gjson使用方法

  • 1. 安装
  • 2. 基本方法
    • 2.1 获取字段值:Get
    • 2.2 通配符 * 遍历数组/对象
    • 2.3 条件查询:#(条件)
    • 2.4 多路径查询:GetMany
    • 2.5 检查字段存在性
    • 2.6 类型判断
  • 3. 高级用法
    • 3.1 预解析 JSON
    • 3.2 转义特殊字符
    • 3.3 遍历数组元素
    • 3.4 修改 JSON(需结合 sjson)
  • 4. 路径语法速查
  • 5. 注意事项

gjson 是一个用于快速查询和解析 JSON 数据的 Go 语言库。它通过灵活的路径语法实现高效的数据提取,无需预先定义结构体。以下是其核心方法及用法详解:

1. 安装

go get github.com/tidwall/gjson

2. 基本方法

2.1 获取字段值:Get

jsonStr := `{"name":"John", "age":30, "pets":["cat", "dog"]}`
result := gjson.Get(jsonStr, "name")       // 获取 "name" 值
fmt.Println(result.String())              // 输出: John

// 嵌套结构
jsonNested := `{"user":{"name":"John", "age":30}}`
age := gjson.Get(jsonNested, "user.age").Int()
fmt.Println(age)                          // 输出: 30

// 数组索引
pets := gjson.Get(jsonStr, "pets.1")       // 获取第二个宠物
fmt.Println(pets.String())                // 输出: dog

2.2 通配符 * 遍历数组/对象

jsonUsers := `{"users":[{"name":"John"}, {"name":"Jane"}]}`
results := gjson.Get(jsonUsers, "users.*.name")
for _, name := range results.Array() {
    fmt.Println(name.String())            // 输出: John 和 Jane
}

2.3 条件查询:#(条件)

jsonData := `{"users":[{"name":"John", "age":30}, {"name":"Jane", "age":25}]}`
// 查找年龄大于25的用户名
result := gjson.Get(jsonData, `users.#(age>25).name`)
fmt.Println(result.String())              // 输出: John

2.4 多路径查询:GetMany

values := gjson.GetMany(jsonStr, "name", "age", "pets.1")
for _, res := range values {
    fmt.Println(res.String())
}
// 输出: John, 30, dog

2.5 检查字段存在性

exists := gjson.Get(jsonStr, "address").Exists()
if !exists {
    fmt.Println("字段不存在")
}

2.6 类型判断

result := gjson.Get(jsonStr, "age")
if result.Type == gjson.Number {
    fmt.Println("字段是数字类型")
}

3. 高级用法

3.1 预解析 JSON

提升重复查询性能:

parsed := gjson.Parse(jsonStr)
name := parsed.Get("name").String()

3.2 转义特殊字符

处理含 . 的字段名:

json := `{"user.name": "John"}`
result := gjson.Get(json, `user\.name`)
fmt.Println(result.String())              // 输出: John

3.3 遍历数组元素

jsonArray := `["apple", "banana", "cherry"]`
gjson.Get(jsonArray, "@this").ForEach(func(_, value gjson.Result) bool {
    fmt.Println(value.String())
    return true // 继续遍历
})

3.4 修改 JSON(需结合 sjson)

import "github.com/tidwall/sjson"

modified, _ := sjson.Set(jsonStr, "name", "Alice")
fmt.Println(modified) // {"name":"Alice", "age":30, ...}

4. 路径语法速查

语法 说明
name 获取字段
user.age 嵌套字段
users.1 数组索引(从0开始)
users.*.name 遍历数组获取所有 name
users.# 获取数组长度
users.#(age>25) 条件过滤

5. 注意事项

性能优势: gjson 直接按路径解析,无需解析整个 JSON,适合处理大文件。

错误处理: 字段不存在时返回 Result{},需用 Exists() 检查。

类型安全: 使用 Int(), String() 等方法时,确保类型匹配。


http://www.kler.cn/a/535129.html

相关文章:

  • Java 23新特性
  • 19C RAC在vmware虚拟机环境下的安装
  • MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)
  • 6 加密技术与认证技术
  • 使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
  • 基于直觉的理性思维入口:相提并论的三者 以“网络”为例
  • 基于springboot+vue的社区居民诊疗健康管理系统设计与实现
  • [Android] 360行车记录仪谷歌版
  • wxWidgets生成HTML文件,带图片转base64数据
  • 优化深度神经网络
  • GitHub 使用教程:从入门到进阶
  • 使用服务器部署DeepSeek-R1模型【详细版】
  • 114,【6】攻防世界 web wzsc_文件上传
  • C++中命名空间(namespace)
  • 基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper
  • 微软发布基于PostgreSQL的开源文档数据库平台DocumentDB
  • 【Android】jni开发之导入opencv和libyuv来进行图像处理
  • 高端入门:Ollama 本地高效部署DeepSeek模型深度搜索解决方案
  • Meta Sapiens AI论文解读:人类视觉模型基石初现,AI 未来走向何方?
  • 115,【7】 攻防世界 web fileinclude
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250206
  • (3)yaml语法
  • 无人机测绘技术,为行业开启解决方案新篇章!
  • 4.攻防世界 unseping
  • 设计模式Python版 享元模式
  • 【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命