如何从 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
删除每行周围的"
使用路径的两种方法:
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
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
如果你的 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
我有以下 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
删除每行周围的"
使用路径的两种方法:
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
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
如果你的 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