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

Ansible中使用json_query过滤器时JMESPath查询返回条目数正确但结果均为null的问题

Ansible中使用json_query过滤器时JMESPath查询返回条目数正确但结果均为null的问题

我来帮你分析下这个问题哈!你遇到的情况是条目数量对但全是null,核心问题出在你写的JMESPath表达式上,咱们一步步拆解:

问题根源

你的set_fact里的json_query表达式写法有误:

filtered_items: "{{ carts | json_query ('results[*].json.products[?total<`1000`].{id: results[*].item, cart: results[*].json.products}') }}"

当你在products[?total<1000]这个子表达式里的时候,JMESPath的上下文已经切换到单个product对象了,这时候你去引用外层的results[*].item或者results[*].json.products,相当于在当前的product对象里找不存在的字段,自然会返回null。而且你想关联的是每个loop迭代对应的item(也就是list0里的'a'/'b'),这个item是在results的每个条目里,不是在products层级下。

修正方案

我们需要调整JMESPath的逻辑:先遍历每个loop执行的结果条目(也就是results[*]),在每个条目内部完成products的过滤,同时关联该条目对应的item。正确的表达式应该是这样的:

filtered_items: "{{ carts | json_query('results[*].{id: item, filtered_products: json.products[?total < `1000`]}') }}"

表达式解释

  • results[*]:遍历每次uri任务执行后的结果条目(因为用了loop,所以carts里的results数组有2个元素,对应list0的'a'和'b')
  • {id: item, filtered_products: json.products[?total < 1000]}:对每个结果条目,构建一个新对象:
    • id:直接取当前结果条目的item字段(也就是loop迭代的'a'或'b')
    • filtered_products:从当前结果条目的json.products数组中,过滤出total小于1000的产品对象

修正后的完整Playbook

---
- hosts: test
  vars:
    list0: ['a', 'b']
  tasks:
    - name: Get carts
      uri:
        url: https://dummyjson.com/carts/1
        method: GET
      register: carts
      loop: "{{ list0 }}"

    - debug: msg="{{ carts }}"

    - set_fact:
        filtered_items: "{{ carts | json_query('results[*].{id: item, filtered_products: json.products[?total < `1000`]}') }}"
        cacheable: yes

    - debug: msg="{{ filtered_items }}"

这样执行后,filtered_items里的每个对象都会正确显示对应的id和符合条件的产品列表,不会再出现null啦!

备注:内容来源于stack exchange,提问作者Bakudan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:55:28