You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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                                                                   ^"}

错误原因

  1. JMESPath语法不兼容Python三元表达式:JMESPath有自己的条件表达式语法,不支持Python风格的if...else写法,这是导致解析报错的直接原因。
  2. 布尔值判断错误:原表达式中将JSON中的布尔类型true当作字符串'true'进行比较,和实际数据类型不匹配,即使语法正确也会得到错误的判断结果。
  3. 输出键名不匹配:原表达式中输出的键是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:34:52