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

Ansible嵌套JMESPath查询中保留null值的实现方法

解决Ansible json_query保留null值的问题

你的问题出在当前的json_query会自动过滤掉data为null的元素,导致输出数组长度和输入不匹配。要保留每个对应位置的null值,需要在查询中对每个元素单独做条件判断,处理data为null的场景。

修改后的查询语句

将原来的_query替换为:

_query: "[].(json.data == null ? null : json.data[*].id) | []"

修改后的完整Playbook

---
- hosts: localhost
  gather_facts: false

  vars:
    response: {
        "results": [
          {
            "item": "server1",
            "json": {
              "data": null,
              "ok": true
            },
            "status": 200
          },
          {
            "item": "server2",
            "json": {
              "data": [
                {
                  "id": 7,
                  "name": "Production5"
                }
              ],
              "ok": true
            },
            "status": 200
          }
        ]
      }

  tasks:
    - debug:
        msg: "{{ response.results | community.general.json_query(_query) }}"
      vars:
        _query: "[].(json.data == null ? null : json.data[*].id) | []"

执行结果

运行后会得到你需要的输出:

TASK [debug] *********************************************
ok: [localhost] => {
    "msg": [
        null,
        7
    ]
}

逻辑说明

  1. [].(...):遍历response.results中的每一个元素
  2. json.data == null ? null : json.data[*].id:对每个元素做三元判断:
    • 如果json.data是null,直接返回null
    • 如果json.data是数组,提取数组内每个元素的id
  3. | []:将嵌套的数组扁平化(比如把[7]转为7),同时保留null值

为什么之前的尝试无效

你之前用的([].json.data || [])[*].id和not_null([].json.data, '[]')是对整个结果数组做统一替换,而非逐个元素处理。这会把第一个元素的null转为空数组,后续[*].id提取不到任何内容,最终被过滤掉,导致输出丢失该位置的元素。

内容的提问来源于stack exchange,提问作者lonix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:53