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
相关产品推荐
相关产品推荐

