4

我正在使用 AWS AppSync 中的 Apache Velocity 模板语言 (VTL)。在我的请求模板中,我查询了具有不同元素的未定义数量的项目。我想要在响应模板中做的是将结果转换为 JSON 对象,稍后我需要它来执行 BatchDeleteItem 操作。这就是我目前解决的方法:

#set($deleteObject='{"Id" : { "S": "nodelete" },"Sk" : { "S": "nodelete" }}')
#set($replaceDeleteObject ="")
#set($separator="")

#foreach( $item in $ctx.result.items )
  #set($replaceDeleteObject = $replaceDeleteObject + $separator + '{"Id" : { "S": "' + $item.Id + '" },"Sk" : { "S": "' + $item.Sk + '" }}')
  #set($separator = ",")
  #set($deleteObject = $replaceDeleteObject)
#end

$util.qr($ctx.stash.put("deleteObject", $deleteObject))

稍后我可以访问我的 deleteObject 并且它可以正常工作。

然而,我的问题是,是否可以在 vtl 中直接创建某种 JSON 对象,我可以在其中附加我的值,而不是以 JSON 对象的形式创建这个字符串?

4

2 回答 2

3

您可以按照AppSync Batch 文档中的示例进行操作:

#set($ids = [])
#foreach($id in ${ctx.args.ids})
    #set($map = {})
    $util.qr($map.put("id", $util.dynamodb.toString($id)))
    $util.qr($ids.add($map))
#end

{
    "version" : "2018-05-29",
    "operation" : "BatchGetItem",
    "tables" : {
        "Posts": {
            "keys": $util.toJson($ids),
            "consistentRead": true
        }
    }
}

因此,对于您的情况,它应该如下所示:

#set ($batchDeleteArray = [])
#foreach( $item in $ctx.result.items )
  #set ($entry = {
    "Id": $util.dynamodb.toString($item.Id),
    "Sk": $util.dynamodb.toString($item.Sk)
  })

  $util.qr($batchDeleteArray.add($entry))
#end

{
    "version" : "2018-05-29",
    "operation" : "BatchDeleteItem",
    "tables" : {
        "TableName": {
          "keys": $util.toJson($batchDeleteArray)
        }
    }
}
于 2019-06-29T06:37:58.727 回答
1

您可以创建一个接近您需要的 JSON 对象的地图/字典。这里有一个编程指南,它应该有你需要的信息,但基本上你想要的是这样的。

#set($deleteObject={
     "Id" : $util.dynamodb.toString("nodelete"),
     "Sk" : $util.dynamodb.toString("nodelete")
})
于 2019-03-18T05:41:01.303 回答