go使用gjson操作json数据

gjson使用

gjson介绍

gjson 是一个 Go 语言库,用于快速解析 JSON 数据。它提供了非常简洁的 API 来查询 JSON 数据,无需预先定义 Go 结构体或映射(map)来匹配 JSON 结构。这使得 gjson 成为处理动态或未知结构的 JSON 数据的理想选择。

安装gjson库

bash 复制代码
go get -u github.com/tidwall/gjson

解析 JSON 字符串

go 复制代码
package main  
  
import (  
    "fmt"  
    "github.com/tidwall/gjson"  
)  
  
func main() {  
    jsonString := `{"name":"Jason", "age":34, "city":"南京", "address":"紫东创意园"}`  
  
    // 获取 "name" 字段的值  
    name := gjson.Get(jsonString, "name").String()  
    fmt.Println("Name:", name)  
  
    // 获取 "age" 字段的值  
    age := gjson.Get(jsonString, "age").Int()  
    fmt.Println("Age:", age)

	// 获取 "address" 字段的值  
    address := gjson.Get(jsonString, "address").String()  
    fmt.Println("Address:", address)  
  
    // 尝试获取不存在的字段,并处理结果  
    nonExist := gjson.Get(jsonString, "non_exist").String()  
    if nonExist == "" {  
        fmt.Println("Non-exist field is empty or not found.")  
    }  
  
    // 处理数组
    jsonArray := `{"fruits":["apple","banana","cherry"]}`  
    firstFruit := gjson.Get(jsonArray, "fruits.0").String()  
    fmt.Println("First Fruit:", firstFruit)  
}

路径语法

gjson 使用类似 XPath 的语法来查询 JSON 数据。一些基本的路径示例包括:

.name:访问顶层对象的 name 字段。

.store.book0.title:访问 store 对象中 book 数组的第一个元素的 title 字段。

#.name:在 JSON 对象的任何层级中搜索 name 字段的第一个匹配项(使用 # 表示递归搜索)。

复杂查询

gjson 还支持更复杂的查询,如使用 | 操作符进行多路径查询,或使用 @this 引用当前节点等。

遍历和修改

需要注意的是,gjson 主要用于查询和解析 JSON 数据,而不是用于修改 JSON 数据。如果你需要修改 JSON 数据,你可能需要将 gjson 解析的结果转换为 Go 的结构体或映射(map),进行修改后再转换回 JSON 字符串。

结论

gjson 是一个强大且灵活的库,用于在 Go 程序中快速解析和查询 JSON 数据。它的简洁 API 和高效的性能使其成为处理 JSON 数据的理想选择,特别是当处理的数据结构未知或动态时。

相关推荐
明月_清风12 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
江湖十年13 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
a1879272183113 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
纪卓志George13 小时前
打破语言范式:在 Go 里用动态代理实现 AOP
架构·go
码艺-Alimjan21 小时前
维吾尔语数字转文本
java·javascript·python·算法·go
名字还没想好☜1 天前
Go 时间格式化为什么用 2006-01-02:time.Format/Parse 的参考时间、时区与解析踩坑
开发语言·后端·golang·go
我的div丢了肿么办2 天前
go语言中的map,map定义不同的数据类型,循环map,map的无序性
后端·go
名字还没想好☜2 天前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
newerp2 天前
Golang 接口的两副面孔:eface、iface 与动态派发之谜
后端·程序员·go
明月_清风2 天前
递归算法:从原理到实战,一次讲透
后端·算法·go