0%

go-json优雅的取值

go 语言中 对于json优雅的取值

go语言中对于json的取值很不方便,需要不停的 类型判断,键的判断…

其实把 程序本来就是帮助人服务的,弄那么复杂 实在是有点难受,不过呢。 难受的不是我一个,以下就是其他难受的人做出来的第三方库。gjson

安装 gjson

go get -u github.com/tidwall/gjson

使用教程:

使用 GJSON 来从一个包含数组的 JSON 字符串中提取数组中的字典(在 JSON 中通常称为对象)或数组中的某个对象的特定字段是非常简单的。假设你有一个如下的 JSON 字符串

{  
"users": [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30},
{"name": "Charlie", "age": 35}
]
}

如果你想获取 users 数组中的第一个用户的 name 字段,你可以这样做:

package main  

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

func main() {
jsonStr := `{"users": [{"name": "Alice", "age": 25},{"name": "Bob", "age": 30},{"name": "Charlie", "age": 35}]}`

// 获取 users 数组中的第一个对象的 name 字段
name := gjson.Get(jsonStr, "users.0.name")
fmt.Println("Name:", name.String()) // 输出: Name: Alice

// 如果你想要遍历整个 users 数组并打印每个用户的 name
users := gjson.Get(jsonStr, "users.#") // # 表示数组中的所有元素
users.ForEach(func(key, value gjson.Result) bool {
fmt.Println("User name:", value.Get("name").String())
return true // 返回 true 以继续迭代,返回 false 则停止
})
}

在这个例子中,users.0.name 是一个路径,它指定了我们要从 JSON 字符串中提取的数据的位置。这里的 0 是数组的索引,用于指定我们要获取的第一个对象。

gjson.Get(jsonStr, "users.#") 使用了 # 通配符来获取数组中的所有元素。然后,我们使用 ForEach 方法遍历这些元素,并打印出每个用户的 name 字段。

注意,gjson.Result 类型有一个 String() 方法用于将结果转换为字符串,但也有其他方法,如 Int(), Bool(), Float(), Array(), Map() 等,用于处理不同类型的值。如果路径不存在或值不是预期的类型,这些方法通常会返回零值或空值,并不会导致 panic。