Jinja模板中对动态长度JSON的嵌套value字段求和求助
问题描述
现有如下JSON响应,需要在Jinja模板中对所有value对象中的数值求和,但body数组长度不固定(有时2个元素,有时3个),此前固定索引的写法会报UndefinedError: list object has no element 2错误。
JSON响应示例:
{ "body": [ { "beg_time": 1689172769, "step_time": 3600, "value": [ [3], [2.2], [1.2] ] }, { "beg_time": 1689187169, "step_time": 3600, "value": [ [0], [0], [0], [2.02], [2.6], [0], [0] ] }, { "beg_time": 1689215969, "step_time": 3600, "value": [ [0], [2.1], [0], [1.4], [0], [0], [0] ] } ], "status": "ok", "time_exec": 0.03644895553588867, "time_server": 1689257978 }
错误写法示例:
{{ value_json2.body.0.value | sum(attribute=0) | round(1) }} + {{ value_json2.body.1.value | sum(attribute=0) | round(1) }} + {{ value_json2.body.2.value | sum(attribute=0) | round(1) }}
解决方案
方法1:循环累加(直观易读)
通过遍历body数组的每个元素,逐个计算子数组数值之和后累加,彻底避免固定索引的问题:
{% set total = 0 %} {% for item in value_json2.body %} {% set sub_sum = item.value | sum(attribute=0) %} {% set total = total + sub_sum %} {% endfor %} {{ total | round(1) }}
方法2:过滤器链式调用(简洁高效)
利用Jinja的map和flatten过滤器提取所有目标数值,再一次性求和:
{{ (value_json2.body | map(attribute='value') | flatten(levels=1) | map(attribute=0)) | sum | round(1) }}
逻辑说明
map(attribute='value'):从body的每个元素中提取value数组flatten(levels=1):把嵌套的二维数组(如[[3],[2.2]])转为一维数组[3,2.2]map(attribute=0):确保提取每个子数组中的唯一数值(因为你的value元素都是单元素数组)sum:对所有提取出的数值求和,最后用round(1)保留一位小数
内容的提问来源于stack exchange,提问作者ttlucian
相关产品推荐
相关产品推荐

