标签: jmespath

使用 jmespath 更改 JSON 密钥

是否有任何理由使用 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。在我的情况下可以使用相同的技术吗?

json jmespath

2
推荐指数
1
解决办法
1974
查看次数

查询多个值

我正在尝试按多个值进行过滤,但是似乎无法使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)

如何做到这一点?

aws-cli jmespath

2
推荐指数
1
解决办法
3396
查看次数

AWS Route53 CLI按值列出列表-资源-记录集

我需要基于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)

dns amazon-web-services amazon-route53 jmespath

2
推荐指数
1
解决办法
2710
查看次数

在 Mac OSx 中安装 jmespth-term

我无法安装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)

macos pip python-2.7 jmespath

1
推荐指数
1
解决办法
1382
查看次数

将 JMESpath 多选过滤器的结果元素与变量连接起来

我在 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)

python jinja2 ansible jmespath

1
推荐指数
1
解决办法
5886
查看次数

如何按标签值过滤 CloudFormation 堆栈?

我想获取具有以下标记/值的所有 CloudFormation 堆栈的堆栈名称:

elasticbeanstalk:environment-namemyenvironment

有什么办法可以做到这一点吗?我尝试了这个查询,但它引发了语法错误:

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)

amazon-web-services aws-cloudformation aws-cli jmespath

1
推荐指数
1
解决办法
2843
查看次数

Jmespath动态设置jmespath expr

我使用 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]'

非常感谢任何帮助。

jmespath

1
推荐指数
1
解决办法
177
查看次数