如何用JMESPath查询获取SniEnabled过滤后的扁平化CSV格式输出
使用JMESPath过滤JSON并生成扁平化CSV格式输出
需求描述
从给定JSON数据中过滤所有
sslState为SniEnabled的条目,生成如下扁平化CSV格式输出(字段以空格分隔):FirstWebApp exmple11.com SniEnabled SecondWebApp xyz.com SniEnabled SecondWebApp xyz2.com SniEnabled输入JSON数据:
[ { "hostNameSslStates": [ { "name": "exmple11.com", "sslState": "SniEnabled" }, { "name": "example22.com", "sslState": "Disabled" }, { "name": "example23", "sslState": "Disabled" } ], "name": "FirstWebApp" }, { "hostNameSslStates": [ { "name": "xyz.com", "sslState": "SniEnabled" }, { "name": "xyz2.com", "sslState": "SniEnabled" }, { "name": "zyx23.com", "sslState": "Disabled" } ], "name": "SecondWebApp" } ]
解决方案
1. JMESPath查询表达式
使用以下JMESPath语句完成筛选与扁平化:
[] | [].{appName: name, sslEntries: hostNameSslStates[?sslState=='SniEnabled']} | [].sslEntries[] | [ [@.parent.appName, @.name, @.sslState] ] | [] | join(' ', @)
2. 执行命令(以jmespath-cli为例)
将JSON数据保存为input.json,执行以下命令:
cat input.json | jp "[] | [].{appName: name, sslEntries: hostNameSslStates[?sslState=='SniEnabled']} | [].sslEntries[] | [ [@.parent.appName, @.name, @.sslState] ] | [] | join(' ', @)"
3. 输出结果
执行后将得到符合要求的输出:
FirstWebApp exmple11.com SniEnabled SecondWebApp xyz.com SniEnabled SecondWebApp xyz2.com SniEnabled
表达式说明
[]:展开顶层数组[].{appName: name, sslEntries: hostNameSslStates[?sslState=='SniEnabled']}:为每个应用构造包含应用名和筛选后SSL条目的对象[].sslEntries[]:展开每个应用下的目标SSL条目,保留父级应用名[ [@.parent.appName, @.name, @.sslState] ]:将每个条目对应的三个字段组合为数组[]:展开所有字段数组join(' ', @):将每个字段数组用空格连接为字符串
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

