API Gateway VTL无法通过变量访问$input.json嵌套数组元素
问题原因
你遇到的问题是因为$input.json()的路径参数是字符串字面量,直接写$.Items[$i]时,VTL不会把$i解析成循环变量的数值,而是把它当作路径的一部分(也就是实际查找的是$.Items[$i]这个不存在的路径),所以返回空字符串。另外你原来的循环范围[$start..$end]也有问题——$end是$.Count,而数组索引是从0到Count-1,这样最后一次循环会访问越界的索引,同样返回空。
解决方法
推荐两种更可靠的写法,直接遍历数组或者正确处理索引:
方法一:直接遍历Items数组(更简洁)
不用手动处理索引,直接遍历整个Items数组,代码更直观:
#set($items = $input.path('$.Items')) [ #foreach($item in $items) { "root": $input.json('$.Items[0]'), "root2": $util.toJson($item) }#if($foreach.hasNext),#end #end ]
方法二:正确使用索引访问
如果必须用索引循环,先把数组赋值给变量,再通过VTL数组语法访问元素:
#set($items = $input.path('$.Items')) #set($count = $input.path('$.Count')) [ #foreach($i in [0..$count-1]) { "root": $input.json('$.Items[0]'), "root2": $util.toJson($items[$i]) }#if($foreach.hasNext),#end #end ]
关键修改点
- 先通过
$input.path('$.Items')把整个数组取出赋值给$items,这样可以用VTL的$items[$i]语法直接访问元素 - 用
$util.toJson()把数组元素转换成合法的JSON字符串,保证输出格式正确 - 添加
#if($foreach.hasNext),#end处理逗号,避免最后一个元素后多出逗号导致JSON格式错误 - 循环范围修正为
[0..$count-1],避免索引越界
内容的提问来源于stack exchange,提问作者romanbird
相关产品推荐
相关产品推荐

