我的 JSON 看起来像这样
{
"keyword1": {
"identifier1": 16
},
"keyword2": {
"identifier2": 16
}
}
我需要循环遍历关键字来获取标识符(不确定我在这里使用的术语是否正确)。看起来很简单,但由于关键字的命名不同,我不知道如何处理。
这个问题的原始标签是
jq
所以这里有一个jq
解决方案:
.[] | keys[]
例如,输入如问题所示:
$ jq '.[] | keys[]' input.json
"identifier1"
"identifier2"
要按照键名称在 JSON 对象中出现的顺序检索键名称,请使用
keys_unsorted
。
我认为按照这些思路进行的操作会很好:
jq '. | to_entries | .[].key'
参见https://jqlang.github.io/jq/manual/#to_entries-from_entries-with_entries
或者如果您想从变量中获取值:
JSON_DATA={main:{k1:v1,k2:v2}}
result=$(jq -n "$JSON_DATA" | jq '.main | to_entries | .[].value' --raw-output)
echo $result
##outputs: v1 v2
我来到这里希望从我的 JSON 中整理出一堆键,我发现两个功能很方便。共有三个函数“to_entries”、“from_entries”和“with_entries”。您可以按键或值过滤值,如下所示:
JSON_DATA='
{
"fields": {
"first": null,
"second": "two",
"third": "three"
}
}
'
echo "$JSON_DATA" | jq '{fields: .fields | with_entries(select(.value != null and .key != "third")) }'
输出:
{
"fields": {
"second": "two"
}
}
更简单的解决方案 - 只需将内部哈希视为新哈希并再添加一个过滤器。对我有帮助的查询:
$ docker network inspect bridge|jq '.[].Containers'
{
"35c9e1273c43db01c45b5f43f6999d04c18beff3996ea09fb8b87a8b635c38ff": {
"Name": "nginx",
"EndpointID": "a6e788d6f90eb14df2321a2eb02517f0862c1fe7fe50c02f2b8c103c0c79cb6b",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"b46c157cec243969f9227251dfd6fa65b7a904e145df80a63f79d4dc8b281355": {
"Name": "sweet_gates",
"EndpointID": "a600d9c1ee35b9f7db31249ae8f589c202e0b260e10a394757a88bfd66b5b42f",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
由于我只需要几个字段,请在上面的 .json 中添加一个查询:
$ docker network inspect bridge|jq -jr '.[].Containers[]|.IPv4Address, "\t", .Name, "\n"'
172.17.0.2/16 nginx
172.17.0.3/16 sweet_gates