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

求助:Ansible json_query(JMESPath)数组元素转换合并无效

解决Ansible json_query混合字符串/对象数组的转换问题

这个问题我碰到过,核心是你用错了merge()函数的用途——它在json_query里是用来合并对象属性的,不是用来拼接数组的,这就是为什么你的表达式没生效。咱们换个直接的思路:遍历数组里的每个元素,根据类型做转换就搞定了!

正确的json_query表达式

直接针对每个元素做类型判断和转换,对应的表达式是:

[*].(type(@) == `string` ? {path: @} : @)

完整Ansible示例

- name: Transform mixed data array with json_query
  hosts: localhost
  vars:
    original_data: [ "just_dir", { "path": "extend_dir", "order": "nginx" } ]
    transformed_data: "{{ original_data | json_query('[*].(type(@) == `string` ? {path: @} : @)') }}"
  tasks:
    - name: Show transformed result
      debug:
        var: transformed_data

表达式拆解

  • [*]:遍历数组中的每一个元素
  • type(@) == string ? {path: @} : @:用三元表达式做分支判断:
    • 如果当前元素(@)是字符串,就生成一个只包含path键的对象,值为当前字符串
    • 如果是对象,直接保留原对象的所有属性

运行结果

执行后会得到完全符合你预期的输出:

transformed_data:
  - path: just_dir
  - path: extend_dir
    order: nginx

为什么原来的写法失效?

你之前的merge([?type(@) == string].{path: @}, [?type(@) == object])里,merge()函数的设计目的是合并两个对象(比如merge({a:1}, {b:2})得到{a:1, b:2}),但你传给它的是两个数组,完全不符合函数的用法,自然得不到想要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:22:41