Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
725 views
in Technique[技术] by (71.8m points)

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

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 ??

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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 ]'

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...