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

