jq工具新手问题:如何编写查询获取JSON中指定组件的版本?
解决jq查询指定组件版本的问题
别担心,刚上手jq和JSON确实需要一点点摸索,我来帮你一步步实现这个需求!
基础查询语句(硬编码组件名)
首先,针对你给出的JSON结构,我们可以先写出一个直接的查询语句来获取my_comp_2的版本:
jq '.[] | select(.name == "my_comp_2") | .desiredVersions[0].name' your_file.json
让我拆解一下每个部分的作用:
.[]:遍历JSON数组中的每一个对象select(.name == "my_comp_2"):筛选出name字段等于目标组件名的对象.desiredVersions[0].name:从筛选出的对象中,取出desiredVersions数组第一个元素的name值(也就是版本号)
执行这个命令后,就会输出你预期的"1.0"(注意jq默认会保留字符串的引号,如果想去掉引号,可以加上-r参数:jq -r '...')
用命令行变量传递组件名(更灵活的方式)
既然你已经知道从命令行传变量的方法,我们可以用jq的--arg参数来动态指定组件名,避免硬编码:
jq --arg comp "my_comp_2" '.[] | select(.name == $comp) | .desiredVersions[0].name' your_file.json
这里的--arg comp "my_comp_2"是在命令行定义一个名为comp的变量,值为my_comp_2,然后在jq的查询语句中用$comp来引用这个变量。这样你可以轻松替换成其他组件名,比如查询my_comp_3只需把参数改成"my_comp_3"就行。
处理边界情况(可选)
如果有些组件的desiredVersions是空数组(比如你的例子里的my_comp_1),上面的语句会返回null。如果想让输出更友好,可以用//运算符设置默认值:
jq --arg comp "my_comp_1" '.[] | select(.name == $comp) | .desiredVersions[0].name // "No version available"' your_file.json
这样查询my_comp_1时就会输出"No version available"而不是null。
内容的提问来源于stack exchange,提问作者mrgreen
相关产品推荐
相关产品推荐

