jq_filter 中是否有一种有效的方法来解析和过滤键、值
Is there an efficient way in jq_filter for parsing and filtering key, values
我有 json 如下所示:
{
"serge12": {
"17": {
"wlan_id": "23",
"interface": "nwce",
"bssid": "00:b7:71:a5:de:60",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "test",
"wlan_profile_name": "wlan",
"location": "default location"
},
"18": {
"wlan_id": "24",
"interface": "nwcg",
"bssid": "00:b7:71:a5:de:61",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "tetra",
"wlan_profile_name": "wnet",
"location": "default location"
},
"serge13": {
"27": {
"wlan_id": "23",
"interface": "nwce",
"bssid": "00:b7:71:a5:de:58",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "test",
"wlan_profile_name": "wlan",
"location": "default location"
},
"29": {
"wlan_id": "24",
"interface": "nwcg",
"bssid": "00:b7:71:a5:de:69",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "tetra_glance",
"wlan_profile_name": "wnet",
"location": "default location"
}
}
}
}
这是一个示例 json 文件,在实际输出中会很大。从这个 json 输出中,我需要过滤“ssid”、“bssid”、“wlan_profile_name”、“location”,预期输出如下所示。
我正在使用 python3.9 和 jq
[
{
"ap_name": "serge12",
"bssid": "00:b7:71:a5:de:60",
"location": "default location",
"ssid": "test",
"wlan_profile_name": "wnet"
},
{
"ap_name": "serge12",
"bssid": "00:b7:71:a5:de:61",
"ssid": "tetraglance",
"wlan_profile_name": "wnet",
"location": "default location"
},
{
"ap_name": "serge13",
"bssid": "00:b7:71:a5:de:58",
"location": "default location",
"ssid": "test",
"wlan_profile_name": "wnet"
},
{
"ap_name": "serge13",
"bssid": "00:b7:71:a5:de:69",
"ssid": "tetraglance",
"wlan_profile_name": "wlan",
"location": "default location"
}
]
我尝试使用 jq_filter 但无法一次性解析它们
jq_filter1 = . | to_entries | map({device:.key})
jq_filter2 = .[] | .| ( to_entries | map({ssid:.value.ssid, bssid:.value.bssid,location:.value.location}))
我不知道我们是否可以加入他们或者有什么有效的方法来处理这个问题。
[
path( .. | objects | select( .ssid ) ) as $path |
getpath($path) |
{ app_name: $path[-2], ssid, bssid, wlan_profile_name, location }
]
Demo 在 jqplay
我有 json 如下所示:
{
"serge12": {
"17": {
"wlan_id": "23",
"interface": "nwce",
"bssid": "00:b7:71:a5:de:60",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "test",
"wlan_profile_name": "wlan",
"location": "default location"
},
"18": {
"wlan_id": "24",
"interface": "nwcg",
"bssid": "00:b7:71:a5:de:61",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "tetra",
"wlan_profile_name": "wnet",
"location": "default location"
},
"serge13": {
"27": {
"wlan_id": "23",
"interface": "nwce",
"bssid": "00:b7:71:a5:de:58",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "test",
"wlan_profile_name": "wlan",
"location": "default location"
},
"29": {
"wlan_id": "24",
"interface": "nwcg",
"bssid": "00:b7:71:a5:de:69",
"atf_override": "n/a",
"atf_policy_id": "n/a",
"atf_policy_name": "n/a",
"ssid": "tetra_glance",
"wlan_profile_name": "wnet",
"location": "default location"
}
}
}
}
这是一个示例 json 文件,在实际输出中会很大。从这个 json 输出中,我需要过滤“ssid”、“bssid”、“wlan_profile_name”、“location”,预期输出如下所示。
我正在使用 python3.9 和 jq
[
{
"ap_name": "serge12",
"bssid": "00:b7:71:a5:de:60",
"location": "default location",
"ssid": "test",
"wlan_profile_name": "wnet"
},
{
"ap_name": "serge12",
"bssid": "00:b7:71:a5:de:61",
"ssid": "tetraglance",
"wlan_profile_name": "wnet",
"location": "default location"
},
{
"ap_name": "serge13",
"bssid": "00:b7:71:a5:de:58",
"location": "default location",
"ssid": "test",
"wlan_profile_name": "wnet"
},
{
"ap_name": "serge13",
"bssid": "00:b7:71:a5:de:69",
"ssid": "tetraglance",
"wlan_profile_name": "wlan",
"location": "default location"
}
]
我尝试使用 jq_filter 但无法一次性解析它们
jq_filter1 = . | to_entries | map({device:.key})
jq_filter2 = .[] | .| ( to_entries | map({ssid:.value.ssid, bssid:.value.bssid,location:.value.location}))
我不知道我们是否可以加入他们或者有什么有效的方法来处理这个问题。
[
path( .. | objects | select( .ssid ) ) as $path |
getpath($path) |
{ app_name: $path[-2], ssid, bssid, wlan_profile_name, location }
]
Demo 在 jqplay