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中的数组的所有元素。你可以使用 #
通配符的情况包括但不限于以下情况:
-
提取数组中的所有元素的特定字段值:你可以使用
#
通配符来提取JSON数组中所有元素的特定字段的值。例如,提取所有用户的姓名:gjson.Get(jsonData, "users.#.name")
-
遍历数组中的元素:你可以使用
#
通配符来遍历JSON数组中的元素,并执行一些操作或条件检查。例如,遍历所有订单并执行某些操作:result := gjson.Get(jsonData, "orders.#") result.ForEach(func(key, value gjson.Result) bool { // 在这里执行操作,value 包含了当前元素的值 return true // 返回 true 继续遍历,或返回 false 停止遍历 })
-
深度遍历JSON结构中的数组:当JSON结构嵌套多层并包含多个数组时,你可以使用
#
通配符来深度遍历嵌套的数组。例如,深度遍历订单中的商品列表:result := gjson.Get(jsonData, "orders.#.products.#") result.ForEach(func(key, value gjson.Result) bool { // 在这里执行操作,value 包含了当前商品的值 return true })
-
匹配多个嵌套数组中的元素:当你需要从多个嵌套的数组中提取数据时,可以使用
#
通配符多次匹配不同的数组。例如,从用户评论中提取所有用户的所有标签:gjson.Get(jsonData, "comments.#.tags.#.label")
总之,#
通配符在 gjson
中非常有用,可以简化提取和遍历JSON数据中的数组元素的操作。它允许你处理未知数组长度和嵌套结构的数据,同时保持查询的灵活性。