如何在JMESPath中使用if/else条件?json_query报错解决
解决Ansible json_query中的JMESPath语法错误,实现加密状态判断需求
问题背景
需要从给定的JSON结构中提取name(重命名为aggregate_name)和is_encrypted属性,规则是:当data_encryption.drive_protection_enabled或data_encryption.software_encryption_enabled为true时,is_encrypted为YES,否则为NO。
给定的JSON结构:
{ "facts": { "changed": true, "failed": false, "response": { "num_records": 1, "records": [ { "data_encryption": { "drive_protection_enabled": false, "software_encryption_enabled": false }, "name": "egg", "uuid": "xxx-xxx" } ] }, "status_code": 200 } }
期望输出:
{ "aggregate_name": "egg", "is_encrypted": "NO" }
原错误的Ansible代码:
egg_info: "{{ egg_info | default ([]) + facts | json_query(\"response.records[*].{name: name, is_encrypted: 'YES' if (data_encryption.software_encryption_enabled == 'true' || data_encryption.drive_protection_enabled == 'true') else 'NO' }\") }}"
报错信息:
{"msg": "JMESPathError in json_query filter plugin:\nExpecting: colon, got: lparen: Parse error at column 66, token \"(\" (LPAREN), for expression:\n\"response.records[*].{name: name, is_encrypted: 'YES' if (data_encryption.software_encryption_enabled == 'true' || data_encryption.drive_protection_enabled == 'true') else 'NO' }\"\n ^"}
错误原因
- JMESPath语法不兼容Python三元表达式:JMESPath有自己的条件表达式语法,不支持Python风格的
if...else写法,这是导致解析报错的直接原因。 - 布尔值判断错误:原表达式中将JSON中的布尔类型
true当作字符串'true'进行比较,和实际数据类型不匹配,即使语法正确也会得到错误的判断结果。 - 输出键名不匹配:原表达式中输出的键是
name,但期望输出是aggregate_name,需要修正映射关系。
解决方案
使用JMESPath标准的条件表达式语法(condition ? result_if_true : result_if_false),修正布尔值判断逻辑,并调整输出键名:
egg_info: "{{ egg_info | default([]) + facts | json_query('response.records[*].{aggregate_name: name, is_encrypted: (data_encryption.drive_protection_enabled || data_encryption.software_encryption_enabled) ? \"YES\" : \"NO\"}') }}"
代码说明
- 条件表达式:用
(条件) ? 真值 : 假值替代Python的三元语法,符合JMESPath的解析规则。 - 布尔值判断:直接使用字段本身作为判断条件(
data_encryption.drive_protection_enabled),因为JSON中该字段是布尔类型,无需和字符串比较。 - 键名映射:将
name映射为aggregate_name,匹配期望的输出结构。
验证结果
当给定的facts中两个加密字段均为false时,输出结果与期望一致:
{ "aggregate_name": "egg", "is_encrypted": "NO" }
若任意一个加密字段为true,is_encrypted会自动变为YES。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

