我有一个来自 GitHub 存储库的 JSON 回复,其中包含某个版本(assets文档中的数组)的可能下载列表。
我想获得浏览器的下载URL时,name资产端有x64.AppImage。
在 Ansible 中,过滤器是基于jmespath它的终端工具构建的,我可以使用以下表达式查询 url:
assets[?ends_with(name, 'x64.AppImage')].browser_download_url
Run Code Online (Sandbox Code Playgroud)
使用以下 playbook,查询 JSON 文档并将其存储在json_reply变量中。
---
- hosts: local
tasks:
- name: Get list of Rambox releases
uri:
url: "https://api.github.com/repos/saenzramiro/rambox/releases/latest"
body_format: json
register: json_reply
- name: Filter reply
debug: URL -> "{{ item }}"
with_items:
- "{{ json_reply.json | json_query(json_filter) }}"
vars:
- json_filter: assets[?ends_with(name, 'x64.AppImage')].browser_download_url
Run Code Online (Sandbox Code Playgroud)
但是,执行此操作会出现以下错误:
fatal: [localhost]: FAILED! => {
"msg": "JMESPathError in json_query filter …Run Code Online (Sandbox Code Playgroud) 我有这个 inputJson:
[{"firstName": "Kancha", "lastName": "Cheena"},
{"firstName": "Harley", "lastName": "Quinn"}]
Run Code Online (Sandbox Code Playgroud)
预期输出:
[{"fname":"Kancha", "value": "Kancha Cheena"},
{"fname":"Harley", "value": "Harley Quinn"}]
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的表达式:
[*].{fname: firstName, value: firstName lastName}
Run Code Online (Sandbox Code Playgroud)
你能建议更正这个表达吗?
我有一个 JSON 对象,我希望在其中使用 JMESPath 检索名称中包含点的属性的值:
{
"a": {
"b.c": "value"
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我希望检索value。我怎样才能做到这一点?
我正在使用 jmespath 搜索一段 JSON,其中一个 JSON 键包含一个“@”符号。由于“@”符号是保留字符,因此 jmespath 会阻塞。我尝试了很多方法来逃避“@”符号,但没有成功。如何在 jmespath 搜索中转义“@”符号?
例子:
json = {"@name": "Bob", "address": "123 Main St"}
jmespath.search("@name", json)
Run Code Online (Sandbox Code Playgroud)
错误信息:
{ParseError} 意外标记:名称:第 1 列解析错误,标记“名称”(UNQUOTED_IDENTIFIER),用于表达式:“@name”^
我还为上述 jmespath 查询尝试了以下变体,但出现了相同的错误:
jmespath.search("!@name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("\@name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("`@`name", json)
Run Code Online (Sandbox Code Playgroud)
jmespath.search("\"@\"name", json)
Run Code Online (Sandbox Code Playgroud) 我正在使用 Azure CLI 获取 vnet 对等互连列表:az network vnet peering list. 这将返回以下结构的 json:
[
{
...
"name": "prefix1-name",
...
},
{
...
"name": "prefix2-name",
...
}
]
Run Code Online (Sandbox Code Playgroud)
我正在尝试按以某个前缀开头的名称过滤结果。我尝试了以下各种组合:
az network vnet peering list --resource-group my-rg --vnet-name my-vnet --query "[?starts_with(name,'prefix1-')].{name}"
但是这总是失败并显示类似].{name} was unexpected at this time.
我错过了什么?
尽管进行了大量研究,我还是找不到解决方案。我被 contains 函数困住了。我有这个 Json 文件:
{
"from": "Api",
"success": true,
"message": "",
"errors": [],
"data": {
"operations": [
{
"IDOperation": 100,
"DateEcriture": "2019-01-02",
"Comment": "Invoice Nh5 numero 152",
"sous_operations": []
},
{
"IDOperation": 101,
"DateEcriture": "2019-01-02",
"Comment": "one other thing",
"sous_operations": []
},
{
"IDOperation":102,
"DateEcriture": "2019-01-02",
"Comment": "an other thing",
"sous_operations": [{"ID-sous-Operation": 103,
"DateEcriture": "2019-01-02",
"Comment": "Invoice Nh15 numero 341"}]
}]
}
}
Run Code Online (Sandbox Code Playgroud)
我想过滤“注释”字段中包含“发票”一词的对象以获得以下结果:
{"operations": [
{
"IDOperation": 100,
"DateEcriture": "2019-01-02",
"Comment": "Invoice Nh5 numero 152"
},
{
"IDOperation": …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 aws route53 cli 命令通过查询列出 zoneId 中的资源记录集
aws route53 list-resource-record-sets \
--hosted-zone-id $zoneId \
--query "ResourceRecordSets[?Name == 'abcd.example.com.']"
Run Code Online (Sandbox Code Playgroud)
但我收到这个错误
Bad value for --query "ResourceRecordSets[?Name: Bad jmespath expression: Unclosed " delimiter: "ResourceRecordSets[?Name
Run Code Online (Sandbox Code Playgroud)
我尝试了几种方法
Bad value for --query "ResourceRecordSets[?Name: Bad jmespath expression: Unclosed " delimiter: "ResourceRecordSets[?Name
Run Code Online (Sandbox Code Playgroud)
aws route53 list-resource-record-sets \
--hosted-zone-id $zoneId \
--query \"ResourceRecordSets[?Name == 'abcd.jazz.t-mobile.com.']\"
Run Code Online (Sandbox Code Playgroud)
但每次我都会遇到同样的错误,我做错了什么吗?另外,我不是在终端中运行它,而是在詹金斯脚本中运行,所以我按照以下方式执行此操作
aws route53 list-resource-record-sets \
--hosted-zone-id $zoneId \
--query \"ResourceRecordSets[?Name == \'abcd.jazz.t-mobile.com.\']\"
Run Code Online (Sandbox Code Playgroud) 我正在尝试循环遍历键列表以从某些 json 中获取关联名称:
- name: show names
debug:
msg: "{{ data.json | json_query(query) }}"
vars:
query: "[? key==item].name"
with_items: "{{ keys.split() }}"
Run Code Online (Sandbox Code Playgroud)
但当我尝试运行它时,它永远不会正确显示。密钥正确,但没有返回数据:
TASK [get_help_on_SO: show]
ok: [localhost] => (item=Key1) => {
"msg": []
}
ok: [localhost] => (item=Key2) => {
"msg": []
}
Run Code Online (Sandbox Code Playgroud)
手动输入代码效果很好,所以我的查询语法似乎是正确的:
query: "[? key==`Key1`].name"
TASK [get_help_on_SO : show]
ok: [localhost] => (item=Key1) => {
"msg": [
"FooBar 1"
]
}
ok: [localhost] => (item=Key2) => {
"msg": [
"FooBar 1"
]
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能正确地将 传递item到 …
我正在尝试使用开关--query(例如az functionapp list --query <something>)从 Azure CLI 命令“探索”json 结果,并且首先我想要结果数组的长度。
Azure CLI 帮助没有说明任何具体内容,并指向 jmespath.org,它确实表明存在长度函数,但它似乎需要一个参数。我没有参数的名称,它是 list 命令返回的根/最外层数组。
从 jmespath.org 看来这length(something)就是我想要的,但我不知道要为“某事”部分添加什么。我在这里放什么?或者我对这一切都错了?
有了这本剧本
---
- name: ReadJsonfile
hosts: localhost
tasks:
- name: Display the JSON file content
shell: "cat config.json"
register: result
- name: save the Json data to a Variable as a Fact
set_fact:
jsondata: "{{ result.stdout | from_json }}"
- name: setDomainName
set_fact:
domain_name: "{{ jsondata | json_query(jmesquery) }}"
vars:
jmesquery: '[].domain[].name'
Run Code Online (Sandbox Code Playgroud)
我的 Linux 服务器上有两个用户:user1和user2
python3.8、pip、ansible-core、ansible-base&jmespath已安装。
我登录user1 ,上面的剧本运行良好
ansible-playbook test.yml
但是,当我登录并user2运行相同的命令时,我收到以下错误
任务 [setDomainName] ************************************************** ********************************************** …
jmespath ×10
json ×4
ansible ×3
azure-cli ×2
aws-cli ×1
azure ×1
contains ×1
escaping ×1
installation ×1
json-query ×1
python-3.x ×1
search ×1
substring ×1