gjson

1. 通配符 ‘#’

1.1 例子

gjson 中,井号 # 是一个通配符,用于匹配JSON数组中的所有元素。在你的查询中,# 用于匹配 NetworkAdapterComplexes 数组中的每个元素,然后继续沿着JSON结构的路径。

让我们解释你的查询的各个部分:

  • NetworkAdapterComplexes.#: 这部分使用 # 通配符,匹配 NetworkAdapterComplexes 数组中的所有元素。

  • NetworkAdapter.Controllers.0.Links.PCIeDevices.#: 在每个 NetworkAdapterComplexes 元素中,这一部分继续沿着路径,匹配 NetworkAdapter 中的 Controllers 数组的第一个元素,然后匹配 Links 中的 PCIeDevices 数组中的所有元素。

  • @odata.id: 最后,这部分用于提取每个匹配元素中的 @odata.id 字段的值。

所以,整个查询的含义是匹配所有 NetworkAdapterComplexes 元素中第一个 Controllers 元素的 PCIeDevices 数组中的所有 @odata.id 值。

通配符 # 用于简化从JSON数组中提取数据的操作,因为它可以匹配数组中的所有元素而无需知道数组的确切长度。

1.2 在gjson查询数据时,什么时候可以使用通配符‘#’

gjson 查询数据时,通配符 # 用于匹配JSON中的数组的所有元素。你可以使用 # 通配符的情况包括但不限于以下情况:

  1. 提取数组中的所有元素的特定字段值:你可以使用 # 通配符来提取JSON数组中所有元素的特定字段的值。例如,提取所有用户的姓名:

    gjson.Get(jsonData, "users.#.name")
  2. 遍历数组中的元素:你可以使用 # 通配符来遍历JSON数组中的元素,并执行一些操作或条件检查。例如,遍历所有订单并执行某些操作:

    result := gjson.Get(jsonData, "orders.#") result.ForEach(func(key, value gjson.Result) bool { // 在这里执行操作,value 包含了当前元素的值 return true // 返回 true 继续遍历,或返回 false 停止遍历 })
  3. 深度遍历JSON结构中的数组:当JSON结构嵌套多层并包含多个数组时,你可以使用 # 通配符来深度遍历嵌套的数组。例如,深度遍历订单中的商品列表:

    result := gjson.Get(jsonData, "orders.#.products.#") result.ForEach(func(key, value gjson.Result) bool { // 在这里执行操作,value 包含了当前商品的值 return true })
  4. 匹配多个嵌套数组中的元素:当你需要从多个嵌套的数组中提取数据时,可以使用 # 通配符多次匹配不同的数组。例如,从用户评论中提取所有用户的所有标签:

    gjson.Get(jsonData, "comments.#.tags.#.label")

总之,# 通配符在 gjson 中非常有用,可以简化提取和遍历JSON数据中的数组元素的操作。它允许你处理未知数组长度和嵌套结构的数据,同时保持查询的灵活性。

posted @ 2023-11-08 10:01  我家有只江小白  阅读(43)  评论(0编辑  收藏  举报