可变的mule_runtimes具有字典列表:
- id: N-Newton
version: 4.3.0
- id: N-Galileo
version: 3.9.0-hf4
- id: N-Einstein
version: 3.8.5-hf4
我想要id = N-Einstein的字典。
我尝试使用此功能:
- debug:
msg: "{{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein') | to_json }}"
并得到错误:({{mule_runtimes | selectattr('id','equalto','N-Einstein')| to_json}})发生意外的模板类型错误:类型为'generator'的对象不是JSON可序列化的。 从列表中选择字典的正确方法是什么?
答案 0 :(得分:1)
第一个问题是mule_runtimes | selectattr('id', 'equalto', 'N-Einstein')
返回一个生成器。可以将其像Python中的d for d in mule_runtimes if d['id'] == 'N-Einstein'
一样。在使用to_json
过滤器之前,您需要将其转换为可序列化的JSON(例如列表)。
第二个问题是它不会从列表中仅选择单个词典。谓词id == 'N-Einstein'
对于多个词典可能是正确的。如果您知道它只能匹配一个词典,则需要将列表转换为一个词典。
将它们放在一起:
{{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein') | list | last | to_json }}
答案 1 :(得分:0)
我建议使用json_query:
- name: dictionaries
vars:
mule_runtimes:
- id: N-Newton
version: 4.3.0
- id: N-Galileo
version: 3.9.0-hf4
- id: N-Einstein
version: 3.8.5-hf4
json: "{{ mule_runtimes }}"
query: "[?id=='{{ want }}'].version"
want: N-Einstein
debug:
msg: "{{ json | json_query(query) }}"
给出输出:
TASK [test : dictionaries] *****************************************************
ok: [127.0.0.1] => {
"msg": [
"3.8.5-hf4"
]
}