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"

您可以使用各种查询方法来查询数据,例如 FindWhereOrWhereWhereInWhereStartsWithWhereEndsWithWhereContains 等。此外,您可以在查询后使用 SumCountGroupByMaxMin 等聚合数据。

让我们看一个快速示例:

示例数据 (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(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 – 要匹配的值。它可以是 intstringboolslice - 取决于 op

  • op – 用于匹配的运算符。可以使用以下运算符:

    • = : 用于相等匹配

    • eq : 与 = 相同

    • != : 用于不相等匹配

    • neq : 与 != 相同

    • <> : 与 != 相同

    • > : 检查数据中给定 key 的值是否大于 val

    • gt : 与 > 相同

    • < : 检查数据中给定 key 的值是否小于 val

    • lt : 与 < 相同

    • >= : 检查数据中给定 key 的值是否大于或等于 val

    • gte : 与 >= 相同

    • <= : 检查数据中给定 key 的值是否小于或等于 val

    • lte : 与 <= 相同

    • in : 检查数据中给定 key 的值是否存在于给定的 val 中。val 应该是 int/float64/stringSlice

    • notIn : 检查数据中给定 key 的值是否不存在于给定的 val 中。val 应该是 int/float64/stringSlice

    • 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 运算。

例如,如果您想要找到 id12‘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/stringSlice

此方法的行为类似于 where(key, "in", val) 方法调用。

WhereNotIn(key, val)

  • key – 数据的属性名称

  • val – 它应该是 int/float64/stringSlice

此方法的行为类似于 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

1 回复

更多关于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 数据提供了类似数据库查询的体验。

回到顶部