Get array with all values for certain key in JSON wih JQ

自作多情 提交于 2021-02-05 08:14:15

问题


Say I have the following JSON:

{
  "a": 0,
  "b": "c",
  "d": {
    "e": {
      "f": "g",
      "comments": {
        "leading": "Lorem ipsum"
      },
      "h": {
        "i": {
          "j": [
            1,
            2
          ]
        },
        "comments": {
          "trailing": "dolor sit"
        }
      }
    },
    "comments": {
      "leading": "amet."
    }
  }
}

I want to get an array with the values of all the fields named comments (which can be nested in any level). So, in this case I want to get:

[
  {
    "leading": "Lorem ipsum"
  },
  {
    "trailing": "dolor sit"
  },
  {
    "leading": "amet."
  }
]

The order of the array doesn't matter.

How can this be achieved with jq? I have only performed basic stuff with it and haven't been able to produce anything close to what I need.

Thanks in advance ☺️


回答1:


You can use the getpath function. Use paths to identify all the paths leading upto .comments and get the paths' value

jq '[ getpath ( paths | select( .[-1] == "comments" ) ) ]'

Or use a recursive descent to filter objects containing .comments and get its value

jq '[ recurse | select(has("comments")?).comments ]'


来源:https://stackoverflow.com/questions/64663297/get-array-with-all-values-for-certain-key-in-json-wih-jq

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!