过指定索引范围获取一个子列表 ### 而通过.[] 则可以直接迭代指定filed 里的values,这里不仅仅是列表了,比如可以通过 .Contact[] 将联系人的全部方式获取出来 $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq .Contact[] "weichuangxxb@qq.com" "371990778" "GoOps" ### 而如果是列表或者数组,则可以指定元素 (支持倒序获取,即.[-1]表示获取列表中的最后一个元素) $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq .Skills[0] { "name": "Python", "type": "dev" } ## 管道 (在jq 的表达式中,可以使用 管道符号 | 来对前面的表达式结果进行再次处理) ### 比如上面的列子中,我们使用.Skills[] 获取了子json,但是如果仅想获取子json中的某一个filed,就可以使用管道的能力 ### 所以,一般管道的更多会和列表类型的迭代配合使用 $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq '.Skills[] | .name ' "Python" "Golang" "Ansible" "Kubernetes" "ElasticSearch" ## 值计算 echo '{"num":12}' | jq '(.num +2)*1024' 14336
注意 1: 在上面的示例中,Skills 字段是一个 列表,我们需要注意, .Skills、.Skills[]、.Skills[N] 以及.Skills[N:M] 的区别
.Skills: 普通的获取 Skills 字段的 values,由于是列表,返回为一个列表,为通用方式 .Skills[]: 迭代 Skills 字段里的元素,因为 Skills 为元素为子 json 的列表,因此返回全部的子 json,为通用方式 .Skills[N]: 获取列表中索引为 N 的元素,仅用于在字段为列表类型时 .Skills[N:M]: 截取列表中索引从 N 到 M 元素为一个新的列表,仅用于字段为列表类型时
注意 2: 在上述中对列表类型的值进行迭代后通过管道取值.Skills[] | .name 和 .Skills[].name 有着相同的作用
2.3 复杂数据类型构建
列表 (数组) 构建 []: 可以将输出字符返回成一个列表 (可以结合多字段使用) 对象构建 {}: 可以联合 () 构建新的 json 对象 {} 可以通过字段构建新的 json 结构,比如 {user, title: .titles[]} 表示将 titles 数组中的元素迭代出来后和 user 字段重新组成多个 json 字串 () 可以用于直接将 value 作为 key,比如 {(.user): .titles} 可以直接构建无声明 key 的 json 串 递归下降..: 可以递归下降,将字符串的每一个 value 都迭代出来,用法和内置的 recurse 函数相似
## 数组构建 $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq '[.Skills[].name ]' [ "Python", "Golang", "Ansible", "Kubernetes", "ElasticSearch" ] $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq '[.Skills[].name,.Name]' [ "Python", "Golang", "Ansible", "Kubernetes", "ElasticSearch", "CloudNativeOps" ] $ echo '{"num": [1,2,3,4]}' | jq '[.num[] | . * 2 ]' [ 2, 4, 6, 8 ] ## 对象构建 ### jq '{Name,Owner,skills: .Skills[].name}' 构建新的json串 $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq '{Name,Owner,skills: .Skills[].name}' { "Name": "CloudNativeOps", "Owner": "GoOps", "skills": "Python" } { "Name": "CloudNativeOps", "Owner": "GoOps", "skills": "Golang" } { "Name": "CloudNativeOps", "Owner": "GoOps", "skills": "Ansible" } { "Name": "CloudNativeOps", "Owner": "GoOps", "skills": "Kubernetes" } { "Name": "CloudNativeOps", "Owner": "GoOps", "skills": "ElasticSearch" } ### jq '{(.Name) : .Skills[].name}' 构建无声明key 的json串 $ echo '{"Name":"CloudNativeOps","Owner":"GoOps","WebSite":"https://bgbiao.top/", "Contact": {"Email":"weichuangxxb@qq.com","QQ":"371990778","WeChat":"GoOps"} ,"Skills": [ {"name":"Python","type":"dev" }, {"name":"Golang","type":"dev" },{"name":"Ansible","type":"ops" },{"name":"Kubernetes","type":"dev" },{"name":"ElasticSearch","type":"ops" }]}' | jq '{(.Name) : .Skills[].name}' { "CloudNativeOps": "Python" } { "CloudNativeOps": "Golang" } { "CloudNativeOps": "Ansible" } { "CloudNativeOps": "Kubernetes" } { "CloudNativeOps": "ElasticSearch" } ## 递归下降 使用 .. 可以将全部的子串解析出来,直到最后的叶子value $ echo '[[{"a":1}]]' | jq '.. ' [ [ { "a": 1 } ] ] [ { "a": 1 } ] { "a": 1 } 1 ### 递归下降获取具体的值 '.. | .filed' #### 获取key 包含a的值 $ echo '[[{"a":1}]]' | jq '.. | .a?' 1
2.4 内置的操作符以及函数
+: 两个过滤器相加,支持 Numbers、Arrays、Strings、Objects 类型 -: 相减,用法同上 *,/,%: 乘除余运算 length: 获取不同类型值的长度,支持 string,array,object,null(zero) utf8bytelength: utf8 的字节长度 keys,keys_unsorted: 获取最外层的 key 以及排序之后的 key,如果是列表或者数组,将返回索引 has(key): 返回 json 中是否包含 key,或者数组 / 列表中是否包含索引下标 【需要注意的是,如果需要解析解析数组 / 列表内部的子串是否包含某个 key,需要先使用 map 函数】 in(object): 判断 json 中是否包含 object 中给定的 key max(x),map_values(x): 使用过滤器 x 对输入数组的元素进行挨个计算,并返回新数组;后者是给值进行计算 path(path_expssion): 输出给定路径表达式中的数组表示。 del(path_expssion): 删除路径表达式中的 filed getpath(PATHS): 获取指定路径的索引 setpath(PATHS; VALUE): 给指定路径设置新的值 delpaths(PATHS): 删除指定路径 to_entries, from_entries, with_entries: 二次处理 json 实体,比如从 [{key:k1,value: v1},{key:k2,value:v2} ] 转换成 {k1:v1,k2:v2} select(boolean_expssion): 使用 bool 表达式进行条件过滤 arrays, objects, iterables, booleans, numbers, normals, finites, strings, nulls,
本文地址:百科问答频道 https://www.neebe.cn/wenda/942831_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!