jq条件过滤JSON对象报错,求正确写法及复合条件实现
解决jq过滤JSON数组的错误与正确写法
首先咱们来排查你遇到的问题:
你的命令报错核心原因是jq参数格式写错了——你把两个过滤表达式用空格和破折号分开,导致jq把后面的map(select(...))当成了要打开的文件名,自然会提示找不到文件。另外,针对reprint字段的判断逻辑也有问题:reprint是布尔值(不是数组),不需要用[]访问,也不该用contains("true")(这个方法是用来匹配字符串的)。
第一个条件:移除reprint为true的对象
正确的思路是:遍历原数组的每个对象,筛选出reprint不为true的对象,最后把结果重新组合成标准JSON数组(如果需要保留数组结构的话)。
对应的完整命令:
curl -s https://archive.scryfall.com/bulk-data/default-cards/default-cards-20200529170427.json | jq '[.[] | select(.reprint != true)]' > reprints_removed.json
关键部分解释:
[ ... ]:把筛选后的结果重新包裹成数组(原数据是数组结构,去掉这个的话,输出会是每个对象单独一行,不是标准JSON数组).[]:遍历原数组里的每一个元素select(.reprint != true):只保留reprint字段不等于true的对象;如果有些对象可能没有reprint字段,可以写成select(.reprint // false != true),避免因字段缺失报错(//表示如果前面的字段不存在,就用后面的默认值)
复合条件:移除reprint为true 或 border_color为silver的对象
这里需要用到jq的逻辑运算符,我们要筛选出同时不满足这两个条件的对象(也就是保留既不是重印卡,边框颜色也不是银色的卡片)。
完整命令:
curl -s https://archive.scryfall.com/bulk-data/default-cards/default-cards-20200529170427.json | jq '[.[] | select(.reprint != true and .border_color != "silver")]' > filtered_cards.json
补充容错处理:
如果存在部分对象缺失reprint或border_color字段的情况,可以给字段加默认值,避免筛选出错:
jq '[.[] | select((.reprint // false) != true and (.border_color // "") != "silver")]'
意思是:如果reprint不存在,默认当成false;如果border_color不存在,默认当成空字符串,确保所有对象都能正常参与判断。
内容的提问来源于stack exchange,提问作者user13647989
相关产品推荐
相关产品推荐

