我正在使用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对象的形式创建此字符串? / p>
答案 0 :(得分:1)
您可以从AppSync Batch docs遵循以下示例:
#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)
}
}
}
答案 1 :(得分:0)
您可以创建一个地图/字典,该地图/字典与您所需的JSON对象接近。有一个编程指南here应该包含您需要的信息,但是本质上您想要的是这样的东西。
#set($deleteObject={
"Id" : $util.dynamodb.toString("nodelete"),
"Sk" : $util.dynamodb.toString("nodelete")
})