【问题标题】:Selecting a subset of properties from nested array of objects从嵌套的对象数组中选择属性的子集
【发布时间】:2019-10-18 15:43:47
【问题描述】:

我有一个深度嵌套的对象数组,我试图从中提取键和值的子集。

[
    {
        "x": {
          "y": {
            "description": "jq rocks",
            "z": [
              {
                "data_1": 123,
                "data_2": [
                  {
                    "field_1": true,
                    "field_2": "hello",
                    "field_3": "red"
                  }
                ]
              },
              {
                "data_1": 123,
                "data_2": [
                  {
                    "field_1": true,
                    "field_2": "goodbye",
                    "field_3": "blue"
                  }
                ]
              },
              {
                "data_1": 123
              }
            ]
          }
        }
    }
]

我正在尝试提取 field_2 和 field_3 以及其他一些字段,但我遇到的问题是它似乎正在组合 field_2 和 field_3 的所有可能组合。

我现在用的jq是

jq '.[] | {
  "description": .x.y.description,
  "subset": [{
     "f_2": .x.y.z[].data_2[]?.field_2,
     "f_3": .x.y.z[].data_2[]?.field_3
  }]
}' tmp.json

使用上面的示例时,它会在数组中返回 4 个条目,而不仅仅是两个。

"subset": [
  {
    "f_2": "hello"
    "f_3": "red"
  }
  {
    "f_2": "hello"
    "f_3": "blue"
  }
  {
    "f_2": "goodbye"
    "f_3": "red"
  }
  {
    "f_2": "goodbye"
    "f_3": "blue"
  }
]

如何强制 jq 对 data_2 数组中的每个对象进行一次处理?

【问题讨论】:

    标签: arrays json iteration jq


    【解决方案1】:

    您可以使用以下内容:

    .[].x.y | { description, subset: [.z[].data_2[]? | { f_2: .field_2, f_3: .field_3 }] }
    

    Try it here.

    您的问题源于基于同一对象中的两次迭代定义两个字段。 [{foo: .x.y.z[].data_2[]?.field_2}] 返回两项,但 [{foo: .x.y.z[].data_2[]?.field_2, bar: .x.y.z[].data_2[]?.field_3}] 返回 4。分解迭代可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-02
      • 2017-06-26
      • 1970-01-01
      • 2021-10-29
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      相关资源
      最近更新 更多