You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用jq根据属性筛选元素并获取指定字段值

解决jq筛选特定元素并提取属性的问题

嘿,作为jq新手碰到这种外层键不固定但内部结构一致的场景,其实很容易解决,我来给你一步步拆解~

首先,先模拟你描述的数组结构(方便你对照理解):

[
  {
    "product_a": {
      "attr1": "foo",
      "attr2": "wanted_value",
      "attr3": false
    }
  },
  {
    "product_b": {
      "attr1": "bar",
      "attr2": "not_wanted",
      "attr3": true
    }
  },
  {
    "product_c": {
      "attr1": "baz",
      "attr2": "also_not_wanted",
      "attr3": false
    }
  }
]

核心思路

因为每个数组元素的外层键(比如product_aproduct_b)不一样,但内部结构完全相同,我们需要先穿透这些外层包装,找到内部的属性结构,再筛选出attr3为真值的元素,最后提取它的attr2值。

基础解决方案

直接用这条jq命令就能搞定:

jq '.[][] | select(.attr3) | .attr2' your_input.json

命令拆解:

  • .[]:遍历数组中的每一个元素(也就是每个带不同外层键的对象)
  • .[][]:进一步提取每个外层对象里的唯一值(因为每个数组元素只有一个外层键,这一步会直接拿到包含attr1/attr2/attr3的内部对象)
  • select(.attr3):筛选出attr3为真值的内部对象(jq里只要值不是falsenull0、空字符串这类“假值”,都会被判定为真)
  • .attr2:提取这个目标对象的attr2属性值

运行上面的示例数据,会输出:

"wanted_value"

更严谨的通用写法

如果担心某些数组元素可能有多个外层键(虽然你说只有一个),可以用to_entries来更稳妥地提取内部结构:

jq '.[] | to_entries[] | .value | select(.attr3) | .attr2' your_input.json
  • to_entries[]:把每个外层对象转换成{"key": "外层键名", "value": "内部结构"}的形式,再遍历这些键值对
  • .value:取出键值对里的内部结构,后续步骤和之前一致

这样不管外层有多少个键,都能准确拿到所有内部结构再筛选~

内容的提问来源于stack exchange,提问作者Alejandro Echeverri

火山引擎 最新活动