如何在 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 映射模板中的嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 VTL 的 AWS Gateway API 映射超时

AWS Lambda/APIG - 新 Sequelize 的新 PostgresDialect 的新 ConnectionManager 出错

AWS API Gateway - 如何在正文映射模板中获取日期/时间戳/纪元?

向 VTL 中的对象添加键/值对(用于 API 网关)

如何在 vtl appsync 解析器中重用/导入代码?

是否有用于使用 VTL 的 AWS Appsync 的 Model.objects.update_or_create()?