如何从 json 中提取特定键

how to extract specific keys from json

我有以下 json 输入文件。我需要像下面这样获取第 2 和第 3 个键。

需要输出为:

test, 2021.1.2
dev, 2021.2.2
test, 2021.1.2
dev, 2021.2.1
test, 2021.3.1

输入json:

[
  {
    "builds": {
      "test": {
        "2021.1.2": {
          "stages": [
            "functional",
            "integration"
          ]
        }
      },
      "dev": {
        "2021.2.2": {
          "stages": [
            "junit",
            "nls"
          ]
        }
      }
    },
    "dockertag": "0.1.1"
  },
  {
    "builds": {
      "test": {
        "2021.1.2": {
          "stages": [
            "functional"
          ]
        }
      },
      "dev": {
        "2021.2.1": {
          "stages": [
            "junit",
            "nls"
          ]
        }
      }
    },
    "dockertag": "0.1.2"
  },
  {
    "builds": {
      "test": {
        "2021.3.1": {
          "stages": [
            "functional",
            "integration"
          ]
        }
      }
    },
    "dockertag": "0.1.3"
  }
]

我尝试了以下代码,但它不完整。我可以获得第二个密钥,但不确定如何进一步提取第三个密钥:

jq -r '.[].builds | keys[] as $k | "\($k), \(.[$k] | .)"' test.json

感谢您的帮助。

.[].builds | to_entries[] | "\(.key), \(.value | keys[])"

将生成

"test, 2021.1.2"
"dev, 2021.2.2"
"test, 2021.1.2"
"dev, 2021.2.1"
"test, 2021.3.1"

使用jq --raw-output删除每行周围的"


Online demo

使用路径的两种方法:


jq -r '.[].builds | paths | select(length == 2) | join(", ")'
test, 2021.1.2
dev, 2021.2.2
test, 2021.1.2
dev, 2021.2.1
test, 2021.3.1

Demo


jq -r 'path(.[].builds[][])[2:] | join(", ")'
test, 2021.1.2
dev, 2021.2.2
test, 2021.1.2
dev, 2021.2.1
test, 2021.3.1

Demo

如果你的 jq 那天坏了,这里是 ruby:

ruby -r json -e 'JSON.parse($<.read).
                 each{|h| h.select{|k,v| k=="builds"}.
                 each{|k,v| ["test","dev"].
                 each{|t| puts "#{t}, #{v[t].keys[0]}" if v.key?(t)}}} ' file    

test, 2021.1.2
dev, 2021.2.2
test, 2021.1.2
dev, 2021.2.1
test, 2021.3.1