如何在 VTL 中处理 AWS APIG 映射模板中的嵌套列表
Posted
技术标签:
【中文标题】如何在 VTL 中处理 AWS APIG 映射模板中的嵌套列表【英文标题】:how to handle nested lists in AWS APIG Mapping Template in VTL 【发布时间】:2016-06-16 17:33:20 【问题描述】:(这是我的模型方案:
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "QuestionsModel",
"type": "array",
"items":
"type": "object",
"properties":
"section_name": "type": "string" ,
"options" :
"type" : "array",
"items" :
"type" : "array",
"items" :
"type" : "string"
这是映射模板:
#set($inputRoot = $input.path('$'))
[
#foreach($question in $inputRoot)
"section_name" : "$question.section_name.S",
"options" : [
#foreach($items in $question.options.L)
[
#foreach($item in $items.L)
"$item.S"
#if($foreach.hasNext),#end
#end
]
#if($foreach.hasNext),#end
#end
]
#if($foreach.hasNext),#end
#end
]
虽然这种语法正确映射了数据,但它导致“选项”是一个空数组。
如果没有指定“选项”,我的 ios 应用就会收到有效的 JSON。但是,当我为“选项”尝试各种语法时,我会得到无效的 JSON 或“内部服务错误”,而 CloudWatch 提供 Unable to transform response
也好不到哪里去。
使用以下内容填充有效选项:L=["L":["S":"1","S":"Dr"],"L":["S":"2","S":"Mr"],"L":["S":"3","S":"Ms"],"L":["S":"4","S":"Mrs"],"L":["S":"5","S":"Prof."]]
,由 Lambda 函数提供。
此时我只能得出结论,API Gateway VTL 不支持嵌套数组。
【问题讨论】:
【参考方案1】:AWS iOS SDK for Modeling 不支持数组数组。
您必须在任何嵌套数组之间定义一个字典。 因此,您可以插入一个额外的“awshack”对象,而不是 array/object/array/array:array/object/array/awshack-object/array
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "QuestionsModel",
"type": "array",
"items":
"type": "object",
"properties":
"section_name": "type": "string" ,
"options" : "type" : "array",
"items" :
"type" : "object",
"properties" :
"awshack" :
"type" : "array",
"items" : "type" : "string"
在映射模板中,“awshack”被滑入最内层循环之外。
#foreach($items in $question.options.L)
"awshack" :
[#foreach($item in $items.L)
"$item.S"#if($foreach.hasNext),#end
#end
#if($foreach.hasNext),#end
]#if($foreach.hasNext),#end
#end
Amazon confirms this limitation.
【讨论】:
以上是关于如何在 VTL 中处理 AWS APIG 映射模板中的嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错
AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?
是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?