是否有任何理由使用 jmespath 将 JSON 密钥更改或转换为其他内容?
例如,如果我有这样的 JSON:
[
{"topic_id": 123, "name": "Topic 1"},
{"topic_id": 234, "name": "Topic 2"}
]
Run Code Online (Sandbox Code Playgroud)
如何将“topic_id”更改为简单的“id”?所以结果会是这样的:
[
{"id": 123, "name": "Topic 1"},
{"id": 234, "name": "Topic 2"}
]
Run Code Online (Sandbox Code Playgroud)
我知道它可以使用任何语言完成,但是每种语言的解决方案都会有所不同。我想有一个使用 jmespath 的不可知解决方案。
根据我在 jmespath doc 中读到的内容,它可用于通过过滤现有的 JSON 来创建新的 JSON。在我的情况下可以使用相同的技术吗?
我正在尝试按多个值进行过滤,但是似乎无法使and子句起作用(例如filter1和filter 2 ...等):
向我显示数据库名称正在“测试”的快照
aws rds describe-db-snapshots --include-shared --query 'DBSnapshots[?DBInstanceIdentifier==`testing`].{DBNAME:DBInstanceIdentifier,SNAPSHOT:DBSnapshotIdentifier}'
[
{
"SNAPSHOT": "test1",
"DBNAME": "testing"
},
{
"SNAPSHOT": "test2",
"DBNAME": "testing"
},
{
"SNAPSHOT": "test3",
"DBNAME": "testing"
},
{
"SNAPSHOT": "test4",
"DBNAME": "testing"
}
]
Run Code Online (Sandbox Code Playgroud)
向我显示名为“ test1”的快照
$ aws rds describe-db-snapshots --include-shared --query 'DBSnapshots[?DBSnapshotIdentifier==`test1`].{DBNAME:DBInstanceIdentifier,SNAPSHOT:DBSnapshotIdentifier}'
[
{
"SNAPSHOT": "test1",
"DBNAME": "testing"
},
{
"SNAPSHOT": "test1",
"DBNAME": "testing2"
}
]
Run Code Online (Sandbox Code Playgroud)
向我显示名为test1的数据库测试快照
aws rds describe-db-snapshots --include-shared --query 'DBSnapshots[?DBInstanceIdentifier==`testing`][?DBSnapshotIdentifier==`test1`].{DBNAME:DBInstanceIdentifier,SNAPSHOT:DBSnapshotIdentifier}'
[]
Run Code Online (Sandbox Code Playgroud)
如何做到这一点?
我需要基于Value在Route53中找到一条记录。我的Route53有10,000多个记录。Web界面当前不支持按值搜索具有2000条以上记录的托管区域。因此,我必须诉诸使用AWS Route53 CLI的list-resource-record-sets命令和--query参数。此参数使用JMESPath选择或过滤结果集。
因此,让我们看一下我们正在使用的结果集。
$ aws route53 list-resource-record-sets --hosted-zone-id Z3RB47PQXVL6N2 --max-items 5 --profile myprofile
{
"NextToken": "eyJTdGFydFJlY29yZE5hbWUiOiBudWxsLCAiU3RhcnRSZWNvcmRJZGVudGlmaWVyIjogbnVsbCwgIlN0YXJ0UmVjb3JkVHlwZSI6IG51bGwsICJib3RvX3RydW5jYXRlX2Ftb3VudCI6IDV9",
"ResourceRecordSets": [
{
"ResourceRecords": [
{
"Value": "ns-1264.awsdns-30.org."
},
{
"Value": "ns-698.awsdns-23.net."
},
{
"Value": "ns-1798.awsdns-32.co.uk."
},
{
"Value": "ns-421.awsdns-52.com."
}
],
"Type": "NS",
"Name": "mydomain.com.",
"TTL": 300
},
{
"ResourceRecords": [
{
"Value": "ns-1264.awsdns-30.org. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
}
],
"Type": "SOA",
"Name": "mydomain.com.",
"TTL": 300
},
{
"ResourceRecords": [
{
"Value": …Run Code Online (Sandbox Code Playgroud) 我无法安装jmespath-term
它给了我:
>> sudo pip install jmespath-term
Collecting jmespath-term
Could not find any downloads that satisfy the requirement jmespath-term
No distributions at all found for jmespath-term
Run Code Online (Sandbox Code Playgroud)
Python版本
python --version
Python 2.7.5
Run Code Online (Sandbox Code Playgroud)
点版本
pip --version
pip 6.0.3 from /Library/Python/2.7/site-packages/pip-6.0.3-py2.7.egg (python 2.7)
Run Code Online (Sandbox Code Playgroud) 我在 Ansible(YAML 格式)中有以下变量结构:
my_groups:
- name: g1
users:
- name: foo
param: rock
junk: whatever
- name: bar
param: paper
junk: whatever
- name: g2
users:
- name: baz
param: scissors
junk: whatever
Run Code Online (Sandbox Code Playgroud)
我需要将它转换为users看起来像这样的平面数组(注意1每个name):
- name: foo1
param: rock
- name: bar1
param: paper
- name: baz1
param: scissors
Run Code Online (Sandbox Code Playgroud)
我使用Jinja过滤器json_query(它内部使用Python 中的JMESPath查询语言),如下所示:
{{ my_groups|json_query( "[*].users[*].{ name: name, param: param }" ) }}
Run Code Online (Sandbox Code Playgroud)
它返回上面提到的数组,但1当然没有名字。有什么方法可以用简单的字符串实现所需的连接吗?由于文档和示例,我尝试了一些变体,但没有运气,即:
{{ my_groups|json_query( "[*].users[*].{ name: …Run Code Online (Sandbox Code Playgroud) 我想获取具有以下标记/值的所有 CloudFormation 堆栈的堆栈名称:
elasticbeanstalk:environment-name:myenvironment
有什么办法可以做到这一点吗?我尝试了这个查询,但它引发了语法错误:
aws cloudformation describe-stacks --query 'Stacks[].Tags[?Key == `elasticbeanstalk:environment-name` && ?Value == `myenvironment`]'
Run Code Online (Sandbox Code Playgroud)
我弄清楚了过滤部分,但我不知道如何获取堆栈名称。这将返回 null,如何检索 StackName?
aws cloudformation describe-stacks --query 'Stacks[].Tags[?Key == `elasticbeanstalk:environment-name` && Value == `myenv`].{MyStack: StackName}'
Run Code Online (Sandbox Code Playgroud) 我使用 jmespath 如下
data = {
"value": [
{
"datasetId": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
"id": "5b218778-e7a5-4d73-8187-f10824047715",
"name": "SalesMarketing2",
"webUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715",
"embedUrl": "https://app.powerbi.com/reportEmbed?reportId=5b218778-e7a5-4d73-8187-f10824047715&groupId=f089354e-8366-4e18-aea3-4cb4a3a50b48",
},
{
"datasetId": "cfafbeb1-8037-4d0c-896e-a46fb27ff229",
"id": "5b218778-e7a5-4d73-8187-f10824047715",
"name": "SalesMarketing3",
"webUrl": "https://app.powerbi.com/groups/f089354e-8366-4e18-aea3-4cb4a3a50b48/reports/5b218778-e7a5-4d73-8187-f10824047715",
"embedUrl": "https://app.powerbi.com/reportEmbed?reportId=5b218778-e7a5-4d73-8187-f10824047715&groupId=f089354e-8366-4e18-aea3-4cb4a3a50b48",
},
]
}
Run Code Online (Sandbox Code Playgroud)
并将 jmespath expr 动态设置为:
report= 'SalesMarketing3'
Run Code Online (Sandbox Code Playgroud)
jmespath.search(f"'value[?name == {report}]'", data)
Run Code Online (Sandbox Code Playgroud)
我没有得到与“SalesMarketing3”对应的字典,而是得到如下输出,我错过了什么吗?
'值[?名称== SalesMarketing3]'
非常感谢任何帮助。