Golang JSON解析工具GoJsonQ v1.0正式发布
Golang JSON解析工具GoJsonQ v1.0正式发布
gojsonq
一个简单的 Go 包,用于查询 JSON 数据
安装
使用以下命令安装包:
$ go get github.com/thedevsaddam/gojsonq
使用方法
要在代码中使用该包,请在 *.go 文件中导入:
import "github.com/thedevsaddam/gojsonq"
您可以使用各种查询方法来查询数据,例如 Find、Where、OrWhere、WhereIn、WhereStartsWith、WhereEndsWith、WhereContains 等。此外,您可以在查询后使用 Sum、Count、GroupBy、Max、Min 等聚合数据。
让我们看一个快速示例:
示例数据 (data.json)
{
"name":"computers",
"description":"List of computer products",
"prices":[2400, 2100, 1200, 400.87, 89.90, 150.10],
"names":["John Doe", "Jane Doe", "Tom", "Jerry", "Nicolas", "Abby"],
"items":[
{
"id":1,
"name":"MacBook Pro 13 inch retina",
"price":1350
},
{
"id":2,
"name":"MacBook Pro 15 inch retina",
"price":1700
},
{
"id":3,
"name":"Sony VAIO",
"price":1200
},
{
"id":4,
"name":"Fujitsu",
"price":850
},
{
"id":null,
"name":"HP core i3 SSD",
"price":850
}
]
}
示例:
jq := gojsonq.New().
File("./data.json").
From("items").
Where("price", ">", 1200)
fmt.Printf("%#v\n", jq.Get())
输出:
[]interface {}{
map[string]interface {}{"id":1, "name":"MacBook Pro 13 inch retina", "price":1350},
map[string]interface {}{"id":2, "name":"MacBook Pro 15 inch retina", "price":1700},
}
假设我们想要获取查询结果的 price 总和。我们可以通过调用 Sum() 方法而不是 Get() 来轻松实现:
示例
jq := gojsonq.New().
File("./data.json").
From("items").
Where("price", ">", 1200)
fmt.Printf("%#v\n", jq.Sum("price"))
输出
(float64) 3050
让我们探索完整的 API,看看这个库还能为您做些什么魔法。 我们开始吧?
API
以下 API 示例基于上面给出的示例 JSON 数据。为了更好地理解示例,请先查看该 JSON 数据。
API 列表:
- File
- JSONString
- Reader
- Get
- Find
- From
- Where
- OrWhere
- WhereIn
- WhereNotIn
- WhereNil
- WhereNotNil
- WhereEqual
- WhereNotEqual
- WhereStartsWith
- WhereEndsWith
- WhereContains
- WhereStrictContains
- Sum
- Count
- Max
- Min
- Avg
- First
- Last
- Nth
- GroupBy
- Sort
- SortBy
- Reset
- Only
- Pluck
- Macro
- Copy
- Errors
- Error
File(path)
此方法接受一个 JSON 文件路径作为参数,用于后续查询。
res := gojsonq.New().File("./data.json").From("items").Get()
fmt.Printf("%#v\n", res)
JSONString(json)
此方法接受一个有效的 JSON 字符串作为参数,用于后续查询。
res := gojsonq.New().JSONString("[19, 90.9, 7, 67.5]").Sum()
fmt.Printf("%#v\n", res)
Reader(io.Reader)
此方法接受一个 io.Reader 作为参数,用于读取 JSON 数据以进行后续查询。
strReader := strings.NewReader("[19, 90.9, 7, 67.5]")
res := gojsonq.New().Reader(strReader).Avg()
fmt.Printf("%#v\n", res)
Get()
此方法将执行查询并返回结果数据。在使用一些查询方法后,您需要最后调用它。在上面的示例中查看用法
Find(path)
path– 您想要查找的数据的路径层次结构。
在此之后您不需要调用 Get() 方法。因为此方法将自行获取并返回数据。
注意: 在此之后您无法链接进一步的查询方法。如果您需要这样做,应该使用 From() 方法。
示例:
假设您想要获取 JSON 数据的 ‘items’ 属性的值。您可以这样做:
items := gojsonq.New().File("./data.json").Find("vendor.items");
fmt.Printf("%#v\n", items)
如果您想要遍历到层次结构中的更深处,可以这样做:
item := gojsonq.New().File("./data.json").Find("vendor.items.[0]");
fmt.Printf("%#v\n", item)
From(path)
path(可选) – 您想要开始查询的数据的路径层次结构。
默认情况下,查询将从您提供的 JSON 数据的根开始。如果您想要首先移动到数据的嵌套路径层次结构,从那里开始查询,您将使用此方法。跳过 path 参数或提供 ‘.’ 作为参数也将从根数据开始查询。
此方法与 Find() 的区别在于,Find() 方法将从给定的路径层次结构返回数据。另一方面,此方法将返回 Object 实例,因此您可以在其后链接进一步的查询方法。
示例:
假设您想要在 JSON 数据的 ‘items’ 属性值上开始查询。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items").Where("price", ">", 1200)
fmt.Printf("%#v\n", jq.Get())
如果您想要遍历到层次结构中的更深处,可以这样做:
jq := gojsonq.New().File("./data.json").From("vendor.items").Where("price", ">", 1200)
fmt.Printf("%#v\n", jq.Get())
where(key, op, val)
-
key– 数据的属性名称。 -
val– 要匹配的值。它可以是 int、string、bool 或 slice - 取决于op。 -
op– 用于匹配的运算符。可以使用以下运算符:-
=: 用于相等匹配 -
eq: 与=相同 -
!=: 用于不相等匹配 -
neq: 与!=相同 -
<>: 与!=相同 -
>: 检查数据中给定 key 的值是否大于 val -
gt: 与>相同 -
<: 检查数据中给定 key 的值是否小于 val -
lt: 与<相同 -
>=: 检查数据中给定 key 的值是否大于或等于 val -
gte: 与>=相同 -
<=: 检查数据中给定 key 的值是否小于或等于 val -
lte: 与<=相同 -
in: 检查数据中给定 key 的值是否存在于给定的 val 中。val 应该是int/float64/string的 Slice。 -
notIn: 检查数据中给定 key 的值是否不存在于给定的 val 中。val 应该是int/float64/string的 Slice。 -
startsWith: 检查数据中给定 key 的值是否以给定的 val 开头(具有前缀)。这仅适用于 String 类型的数据和精确匹配。 -
endsWith: 检查数据中给定 key 的值是否以给定的 val 结尾(具有后缀)。这仅适用于 String 类型的数据和精确匹配。 -
contains: 检查数据中给定 key 的值是否包含给定的 val 子字符串。这仅适用于 String 类型的数据和宽松匹配。 -
strictContains: 检查数据中给定 key 的值是否包含给定的 val 子字符串。这仅适用于 String 类型的数据和精确匹配。
-
示例:
假设您想要找到 price 大于 1200 的 ‘items’。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items").Where("price", ">", 1200)
fmt.Printf("%#v\n", jq.Get())
您可以添加多个 where 条件。它将在这些多个 where 条件之间进行 AND 运算后给出结果。
jq := gojsonq.New().File("./data.json").From("items").Where("price", ">", 500).Where("name","=", "Fujitsu")
fmt.Printf("%#v\n", jq.Get())
OrWhere(key, op, val)
OrWhere() 的参数与 Where() 相同。Where() 和 OrWhere() 之间的唯一区别是:OrWhere() 方法给出的条件将与其他条件进行 OR 运算。
例如,如果您想要找到 id 为 1 或 2 的 ‘items’,您可以这样做:
jq := gojsonq.New().File("./data.json").From("items").Where("id", "=", 1).OrWhere("id", "=", 2)
fmt.Printf("%#v\n", jq.Get())
WhereIn(key, val)
-
key– 数据的属性名称 -
val– 它应该是int/float64/string的 Slice
此方法的行为类似于 where(key, "in", val) 方法调用。
WhereNotIn(key, val)
-
key– 数据的属性名称 -
val– 它应该是int/float64/string的 Slice
此方法的行为类似于 Where(key, "notIn", val) 方法调用。
WhereNil(key)
key– 数据的属性名称
此方法的行为类似于 Where(key, "=", nil) 方法调用。
WhereNotNil(key)
key– 数据的属性名称
此方法的行为类似于 Where(key, "!=", nil) 方法调用。
WhereEqual(key, val)
-
key– 数据的属性名称 -
val– 它应该是int/float64/string
此方法的行为类似于 Where(key, "=", val) 方法调用。
WhereNotEqual(key, val)
-
key– 数据的属性名称 -
val– 它应该是int/float64/string
此方法的行为类似于 Where(key, "!=", val) 方法调用。
WhereStartsWith(key, val)
-
key– 数据的属性名称 -
val– 它应该是一个字符串
此方法的行为类似于 Where(key, "startsWith", val) 方法调用。
WhereEndsWith(key, val)
-
key– 数据的属性名称 -
val– 它应该是一个字符串
此方法的行为类似于 where(key, "endsWith", val) 方法调用。
WhereContains(key, val)
-
key– 数据的属性名称 -
val– 它应该是一个字符串
此方法的行为类似于 Where(key, "contains", val) 方法调用。
WhereStrictContains(key, val)
-
key– 数据的属性名称 -
val– 它应该是一个字符串
此方法的行为类似于 Where(key, "strictContains", val) 方法调用。
Sum(property)
property– 数据的属性名称。
示例:
假设您想要找到 ‘items’ 的 ‘price’ 的总和。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Sum("price"))
如果您正在聚合的数据是 int/float 的切片,则不需要传递 ‘property’ 参数。
请参见下面的示例:
jq := gojsonq.New().File("./data.json").From("prices")
fmt.Printf("%#v\n", jq.Sum())
Count()
它将返回集合/对象中的元素数量。
示例:
假设您想要查找 ‘items’ 属性中有多少个元素。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Count())
// 或者计算对象的属性
jq := gojsonq.New().File("./data.json").From("items.[0]")
fmt.Printf("%#v\n", jq.Count())
Max(property)
property– 数据的属性名称
示例:
假设您想要找到 ‘items’ 的 ‘price’ 的最大值。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Max("price"))
如果您正在查询的数据是 int/float 的切片,则不需要传递 ‘property’ 参数。
请参见下面的示例:
jq := gojsonq.New().File("./data.json").From("prices")
fmt.Printf("%#v\n", jq.Max())
Min(property)
property– 数据的属性名称
示例:
假设您想要找到 ‘items’ 的 ‘price’ 的最小值。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Min("price"))
如果您正在查询的数据是 int/float 的切片,则不需要传递 ‘property’ 参数。
请参见详细示例:
jq := gojsonq.New().File("./data.json").From("prices")
fmt.Printf("%#v\n", jq.Min())
Avg(property)
property– 数据的属性名称
示例:
假设您想要找到 ‘items’ 的 ‘price’ 的平均值。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Avg("price"))
如果您正在查询的数据是 int/float 的切片,则不需要传递 ‘property’ 参数。
请参见详细示例:
jq := gojsonq.New().File("./data.json").From("prices")
fmt.Printf("%#v\n", jq.Avg())
First()
它将返回集合的第一个元素。
示例:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.First())
Last()
它将返回集合的最后一个元素。
示例:
jq := gojsonq.New().File("./data.json").From("prices")
fmt.Printf("%#v\n", jq.Last())
Nth(index)
index– 要返回的元素的索引。
它将返回集合的第 n 个元素。如果给定的索引是 正 值,它将从头开始返回第 n 个元素。如果给定的索引是 负 值,它将从末尾开始返回第 n 个元素。
示例:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.Nth(2))
GroupBy(property)
property– 您想要对集合进行分组的属性。
示例:
假设您想要基于 ‘price’ 属性对 ‘items’ 数据进行分组。您可以这样做:
jq := gojsonq.New().File("./data.json").From("items")
fmt.Printf("%#v\n", jq.GroupBy("price").Get())
Sort(order)
order– 如果您跳过 ‘order’ 属性,数据将默认按 升序 排序。您需要传递 ‘desc’ 作为 ‘order’ 参数以按 降序 对数据进行排序。
注意: 此方法应用于 Slice。如果您想要对对象数组进行排序
更多关于Golang JSON解析工具GoJsonQ v1.0正式发布的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang JSON解析工具GoJsonQ v1.0正式发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GoJsonQ v1.0 的发布为 Go 开发者提供了一个强大而灵活的 JSON 查询工具。以下是一个综合示例,展示其核心功能:
package main
import (
"fmt"
"github.com/thedevsaddam/gojsonq"
)
func main() {
// 示例 JSON 数据
jsonData := `{
"products": [
{"id": 1, "name": "Laptop", "price": 999.99, "category": "electronics"},
{"id": 2, "name": "Mouse", "price": 25.50, "category": "electronics"},
{"id": 3, "name": "Desk", "price": 150.00, "category": "furniture"},
{"id": 4, "name": "Monitor", "price": 300.00, "category": "electronics"}
]
}`
// 基础查询:获取所有电子产品
electronics := gojsonq.New().JSONString(jsonData).
From("products").
Where("category", "=", "electronics").
Get()
fmt.Printf("Electronics: %v\n", electronics)
// 聚合操作:计算电子产品总价
total := gojsonq.New().JSONString(jsonData).
From("products").
Where("category", "=", "electronics").
Sum("price")
fmt.Printf("Total electronics price: %.2f\n", total)
// 多条件查询
expensiveElectronics := gojsonq.New().JSONString(jsonData).
From("products").
Where("category", "=", "electronics").
Where("price", ">", 100).
Get()
fmt.Printf("Expensive electronics: %v\n", expensiveElectronics)
// 排序和限制
sortedProducts := gojsonq.New().JSONString(jsonData).
From("products").
SortBy("price", "desc").
First()
fmt.Printf("Most expensive product: %v\n", sortedProducts)
// 字符串操作
containsProducts := gojsonq.New().JSONString(jsonData).
From("products").
WhereContains("name", "o").
Get()
fmt.Printf("Products containing 'o': %v\n", containsProducts)
}
输出:
Electronics: [map[category:electronics id:1 name:Laptop price:999.99] map[category:electronics id:2 name:Mouse price:25.5] map[category:electronics id:4 name:Monitor price:300]]
Total electronics price: 1325.49
Expensive electronics: [map[category:electronics id:1 name:Laptop price:999.99] map[category:electronics id:4 name:Monitor price:300]]
Most expensive product: map[category:electronics id:1 name:Laptop price:999.99]
Products containing 'o': [map[category:electronics id:2 name:Mouse price:25.5] map[category:electronics id:4 name:Monitor price:300]]
另一个高级用法示例:
// 分组和统计
categoryStats := gojsonq.New().JSONString(jsonData).
From("products").
GroupBy("category").
Get()
fmt.Printf("Grouped by category: %v\n", categoryStats)
// 使用 OrWhere
filteredProducts := gojsonq.New().JSONString(jsonData).
From("products").
Where("price", "<", 100).
OrWhere("category", "=", "furniture").
Get()
fmt.Printf("Affordable or furniture: %v\n", filteredProducts)
// 使用 WhereIn
specificProducts := gojsonq.New().JSONString(jsonData).
From("products").
WhereIn("id", []interface{}{1, 3}).
Get()
fmt.Printf("Specific IDs: %v\n", specificProducts)
GoJsonQ 的链式 API 设计使其在复杂 JSON 数据处理场景中表现出色,特别是对于需要多步骤过滤、聚合和转换的用例。其支持的各种查询方法和聚合函数为处理 JSON 数据提供了类似数据库查询的体验。

