我正在尝试解析ansible中的json,我得到了我需要的值,但输出是一个数组。我怎样才能获得价值?
示例json:
{
"Version": "2015-08-13",
"Accounts": [{
"AccountName": "account1",
"Regions": [{
"RegionName": "region1",
"RegionId": "region1",
"RegionDetails": [{
"id": "id1",
"version": "v1"
}, {
"id": "id2",
"version": "v2"
}]
}]
}, {
"AccountName": "account2",
"Regions": [{
"RegionName": "region1",
"RegionId": "region1",
"RegionDetails": [{
"id": "id1",
"version": "v1"
}, {
"id": "id2",
"version": "v2"
}]
}]
}]
}
Ansible playbook示例:
- name: Set Global Vars
hosts: localhost
tasks:
- name: print json file
debug:
msg: "{{ (lookup('file','./example.json') | from_json) | json_query(query) }}"
vars:
query: "Accounts[?AccountName=='account1'][Regions[?RegionName=='region1'].RegionId]"
register: region_id
Ansible输出:
TASK [print json file] *********************************************************
ok: [localhost] => {
"msg": [
[
[
"region1"
]
]
]
}
正如您所看到的,'region1'值仍然是嵌套的。我怎样才能获得价值?
谢谢!
答案 0 :(得分:2)
您的原始数据包含嵌套列表:Accounts
是一个列表,每个帐户都包含Regions
列表。
使用您的JMESPath查询,您可以按某些条件过滤列表,但结果仍然是列表,因为您的数据可能包含多个名为AccountName=='account1'
的帐户。
如果您只对该帐户的第一个找到的帐户和首次找到的地区感兴趣,可以按如下方式修改查询:
Accounts[?AccountName=='account1'] | [0].Regions[?RegionName=='region1'] | [0].RegionId