Ansible解析JSON返回undefined值 提取metrics字段异常排查
问题根因
- 过滤到
param层级时,你拿到的是二维嵌套列表:外层列表的元素是子列表,每个子列表内部才是存了metrics1/metrics2/metrics3字段的字典对象。列表本身没有metrics2属性,直接调用map(attribute='metrics2')自然会返回AnsibleUndefined。 - 另外你贴的示例JSON里前4个字典的键值对缺失逗号分隔(比如
"metrics2": "B"后直接跟"metrics3": "C"),先确认实际接口返回的JSON语法合规,否则JSON解析阶段就会抛出异常。
修正代码
单独提取metrics2字段
先把嵌套的二维列表拍平为一维字典列表,再提取目标字段即可:
parseJSON: "{{ JSONcontent['results'] | map(attribute='json.item.param') | flatten | map(attribute='metrics2') | list }}"
执行后返回结果为:['B', 'E', 'H', 'K', 'N', 'Q']
提取两列数据生成表格
如果要直接拿到适配两列表格的数据源(metrics2为第一列、metrics3为第二列),用zip把两个字段的提取结果按位置配对即可:
table_data: "{{ JSONcontent['results'] | map(attribute='json.item.param') | flatten | map(attribute='metrics2') | zip(JSONcontent['results'] | map(attribute='json.item.param') | flatten | map(attribute='metrics3')) | list }}"
返回的table_data每一项都是一个二元组,直接传入表格渲染组件即可生成如下结果:
| metrics2值 | metrics3值 |
|---|---|
| B | C |
| E | F |
| H | I |
| K | L |
| N | O |
| Q | R |
逻辑说明
- 链式属性提取:
map(attribute='json.item.param')可以直接跨多层级取属性,不需要多次调用map逐层写 - 列表拍平:
flatten过滤器会把两层嵌套的param列表展开,得到一维的、由指标字典组成的列表,后续就可以正常提取字典属性 - 字段配对:
zip过滤器会把两个等长列表按下标一一对应,生成表格行结构
内容的提问来源于stack exchange,提问作者asking
相关产品推荐
相关产品推荐

