微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache VTL - 复制节点

如何解决Apache VTL - 复制节点

有没有办法使用 apache VTL 进行深度复制? 我试图使用 x-amazon-apigateway-integration 使用 requestTemplates。 输入的JSON如下图,

{
  "userid": "21d6523137f6","time": "2020-06-16T15:22:33Z","item": {
    "UserID" : { "S": "21d6523137f6" },<... some complex json nodes here ...>,"TimeUTC" : { "S": "2020-06-16T15:22:33Z" },}
} 

requestTemplate 如下图,

        requestTemplates:
          application/json: !Sub
            - |
              #set($inputRoot = $input.path('$'))
              {
                "TableName": "${tableName}","ConditionExpression": "attribute_not_exists(TimeUTC) OR TimeUTC > :sk","ExpressionAttributeValues": {
                  ":sk":{
                    "S": "$util.escapeJavaScript($input.path('$.time'))"
                  }
                },"Item": "$input.path('$.item')",<== copy the entire item over to Item.
                "ReturnValues": "ALL_OLD","ReturnConsumedCapacity": "INDEXES","ReturnItemCollectionMetrics": "SIZE"
              }
            - {
            tableName: !Ref EventsTable
            }

问题是,该项目被复制,

  "Item": "{UserID={S=21d6523137f6},Lat={S=37.33180957},Lng={S=-122.03053391},... other json elements...,TimeUTC={S=2020-06-16T15:22:33Z}}",

如您所见,整个嵌套的 json 变成了一个属性。虽然我预计它会成为一个完全成熟的 json 节点,如下所示,

  "Item": {
    "UserID" : { "S": "21d6523137f6" },"Lat": { "S": "37.33180957" },"Lng": { "S": "-122.03053391" },<.... JSON nodes ...>
    "TimeUTC" : { "S": "2020-06-20T15:22:33Z" }
  },

是否可以像上面那样在 json 节点上进行深度/嵌套复制操作,而无需执行迭代节点和附加子节点 o json 节点变量等的功夫...

顺便说一句,我使用的是 AWS API Gateway 请求模板,因此它可能不支持所有 Apache VTL 模板选项。

解决方法

您需要使用 $input.json 方法而不是 $input.path

"Item": $input.json('$.item'),

请注意,我删除了双引号。

如果你有双引号是因为你想字符串化 $.item,你可以这样做:

"Item": "$util.escapeJavaScript($input.json('$.item'))",

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。